Synchronization 使用信号量的可重用屏障

Synchronization 使用信号量的可重用屏障,synchronization,mutex,semaphore,barrier,Synchronization,Mutex,Semaphore,Barrier,我正在回顾《信号灯小书》中关于可重用屏障的讨论。在检查书中的答案之前,我写下了这个解决方案(如下)。因为书中的解决方案有点复杂(两个旋转栅门),我猜我错过了一些明显的东西。有人能帮我指出它有什么问题吗 # count = 0; # mutex = semaphore(1); # barrier = semaphore(0); # rendezvous point mutex.wait(); count = count + 1; if (count == n) barrier.

我正在回顾《信号灯小书》中关于可重用屏障的讨论。在检查书中的答案之前,我写下了这个解决方案(如下)。因为书中的解决方案有点复杂(两个旋转栅门),我猜我错过了一些明显的东西。有人能帮我指出它有什么问题吗

# count = 0;
# mutex = semaphore(1);
# barrier = semaphore(0);

# rendezvous point

mutex.wait();
    count = count + 1;
    if (count == n) barrier.signal();
mutex.signal();

barrier.wait();

mutex.wait();
    count = count - 1;
    if (count != 0) barrier.signal();
mutex.signal();

# critical point
以下是书中提出的使用两个旋转栅门(1号和2号栅栏)的解决方案,供参考


讨论了后来提出的相同问题。您错过了第一个恢复的进程在其他进程离开屏障之前重新进入屏障的可能性。讨论了稍后提出的相同问题。您错过了第一个恢复的进程在其他进程离开屏障之前重新进入屏障的可能性。
# count = 0; 
# mutex = semaphore(1); 
# barrier1 = semaphore(0); 
# barrier2 = semaphore(1); 

# rendezvous point  

mutex.wait(); 
    count = count + 1; 
    if (count == n) 
        barrier2.wait(); 
        barrier1.signal(); 
mutex.signal(); 

barrier1.wait(); 
barrier1.signal(); 

# critical point

mutex.wait(); 
    count = count – 1; 
    if (count == 0) 
        barrier1.wait(); 
        barrier2.signal(); 
mutex.signal(); 

barrier2.wait(); 
barrier2.signal();