zoukankan      html  css  js  c++  java
  • C语言 wait()信号量部分 signal()信号量部分代码

    http://blog.csdn.net/raykid13/archive/2008/10/16/3087858.aspx

    信号量结构使用C语言表示如下:

    1. typedef struct {
    2.     int value;//记录了这个信号量的值 
    3.     struct process *list;//储存正在等待这个信号量的进程 
    4. } semaphore;

    wait()信号量部分代码如下:

    1. wait(semaphore *S) {
    2.     S->value--;
    3.     if(S->value < 0) {
    4.         add this process to S->list;
    5.         block();
    6.     }
    7. }

    signal()信号量部分代码如下:

    1. signal(semaphore *S) {
    2.     S->value++;
    3.     if(S->value <= 0) {
    4.         remove a process P from S->list;
    5.         wakeup(P);
    6.     }
    7. }

    一、The Bounded-Buffer Problem:

    full初始化为0,empty初始化为n,mutex为1

    1. do{
    2.     wait(full);
    3.     wait(mutex);
    4.     ...
    5.     //remove an item from buffer to nextc
    6.     ...
    7.     signal(mutex);
    8.     signal(empty);
    9.     ...
    10.     //consume the item in nextc
    11.     ...
    12. while(TRUE);

    二、The Readers-Writers Problem:

    wrt初始化为1,readcount初始化为0,mutex为1

    写者操作:

    1. do{
    2.     wait(wrt);
    3.     ...
    4.     //writing is performed 
    5.     ...
    6.     signal(wrt);
    7. while(TRUE);

    读者操作:

    1. do{
    2.     wait(mutex);//确保与signal(mutex)之间的操作不会被其他读者打断
    3.     readcount++;
    4.     if(readcount == 1)
    5.         wait(wrt);
    6.     signal(mutex);
    7.     ...
    8.     //reading is performed
    9.     ...
    10.     wait(mutex);
    11.     readcount--;
    12.     if(readcount == 0)
    13.         signal(wrt);
    14.     signal(mutex);
    15. while(TRUE);

    三、The Dining-Philosophers Problem:

    所有的chopstick[5]全部初始化为1

    1. do{
    2.     wait(chopstick[i]);
    3.     wait(chopstick[(i+1)%5]);
    4.     ...
    5.     //eating
    6.     ...
    7.     signal(chopstick[i]);
    8.     signal(chopstick[(i+1)%5]);
    9.     ...
    10.     //thinking
    11.     ...
    12. while(TRUE);

    但是这个解决方案的最大问题在于它会出现死锁。所以我认为应该增加一个信号量mutex,并初始化为1:

    1. do{
    2.     wait(mutex);
    3.     wait(chopstick[i]);
    4.     wait(chopstick[(i+1)%5]);
    5.     signal(mutex);
    6.     ...
    7.     //eating  
    8.     ...
    9.     wait(mutex);
    10.     signal(chopstick[i]);
    11.     signal(chopstick[(i+1)%5]);
    12.     signal(mutex);
    13.     ...
    14.     //thinking  
    15.     ...
    16. while(TRUE);

    这样由于确保了一位哲学家在拿起两只筷子的时间内其他哲学家不可以拿起任何一支筷子,从而破坏了死锁出现需要的四个特征中的Hold And Wait特征,从而避免了死锁的发生。

     

    最后,死锁发生的四个特征包括:

    1. Mutual exclusion;

    2. Hold and wait;

    3. No preemption;

    4. Circular wait;

    当四个条件全部满足的时候,死锁将有可能发生。

  • 相关阅读:
    解决 Windows Server 2008 R2 上 Windows Update 无法失败,提示 8024402F
    【UWP】实现 FindAncestor 绑定
    实现在 .net 中使用 HttpClient 下载文件时显示进度
    【UWP】手动实现 WebAuthenticationBroker
    记录使用 Cake 进行构建并制作 nuget 包
    w筛选系数=(1+错次)/(1+总次)
    WZP身份溯源策略(World Zero Protection),宜分宜合、自主可控的实名认证体系
    WZP报文封装协议(Web Zip Protocol),安全可嵌套的传输协议
    WZP安全配置方案,针对通讯技术的安全措施
    WZP网络结构模型,对OSI参考模型和TCP/IP模型的改进
  • 原文地址:https://www.cnblogs.com/cy163/p/1342558.html
Copyright © 2011-2022 走看看