使用信号量进行线程同步的示例

时间:2014-03-13 14:00:01

标签: semaphore thread-synchronization

我很难与信号量进行进程同步。基本上,我没有看到中断如何破坏程序,并构建方案来解决问题。以下是我困住了几天的问题。请帮忙。提前谢谢!

描述:“H2O”问题。

hReady()和oReady()是“生成”H和O的函数。每个H线程和O线程执行hReady()和oReady()。准备好两个H和一个O后,其中一个程序必须调用makewater()。解决方案应避免饥饿和忙碌等待。还假设线程唤醒的FIFO策略。

方法1:这种方法有什么问题吗? (答案是肯定的。我可以理解为什么。)

int numHydrogen = 0; 
sema_t pairOfHydrogen = 0; 
sema_t oxygen = 0; 

void hReady() { 
    numHydrogen ++;                // I'm assuming here should have a mutex
    if ((numHydrogen % 2) == 0) { 
    signal(pairOfHydrogen); 
    } 
    wait(oxygen); 
} 

void oReady() { 
    wait(pairOfHydrogen); 
    makeWater(); 
    signal(oxygen); 
    signal(oxygen); 
} 

方法2:有什么问题吗? (答案是肯定的。但我不太清楚为什么。还有如何构建特定的场景?)

sema_t hPresent = 0; 
sema_t waitForWater = 0; 

void hReady() { 
    signal(hPresent); 
    wait(waitForWater); 
} 

void oReady() { 
    wait(hPresent);       // It seems something wrong here. I'm not sure why
    wait(hPresent);       // Also here. Why?
    makeWater(); 
    signal(waitForWater); 
    signal(waitForWater); 
}

方法3:在方法2中假设线程唤醒的LIFO。有任何问题吗? (也是的。但是为什么?在这个问题中如何唤醒政策?)

有没有简单的方法来解决类似的问题?如何构建场景?再次感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

方法1

场景:hReadyoReady之前启动。

hReady帖子中发生了什么:

  1. 构建一个H
  2. 我们有一对H吗? - >不(不要发出信号)
  3. 等待O(被阻止)
  4. oReady帖子中发生了什么:

    1. 等待H2(没有 - >阻止)
    2. 所以你的2个演员被封锁,因为hReady只产生一个H而不是2,等待一个永远不会来的O(因为他也在等待)。 另外,正如您所注意到的,numHydrogen可能需要R / W保护。

      方法2

      几乎相同的情况:当您启动hReady时,您会被waitForWater屏蔽。 oReady中的第一次等待已解锁但第二次等待将永远持续,因为您没有发出waitForWater

      的信号

      虽然我不理解方法3