【发布时间】:2011-12-22 01:59:01
【问题描述】:
Barrier 是一种同步结构,其中一组进程全局同步,即集合中的每个进程到达屏障并等待所有其他进程到达,然后所有进程离开屏障。令集合中的进程数为 3,S 为具有常用 P 和 V 函数的二进制信号量。考虑以下 C 实现的屏障,其中行号显示在左侧。
void barrier (void) {
1: P(S);
2: process_arrived++;
3: V(S);
4: while (process_arrived !=3);
5: P(S);
6: process_left++;
7: if (process_left==3)
{
8: process_arrived = 0;
9: process_left = 0;
10: }
11: V(S);
}
变量 process_arrived 和 process_left 在所有进程之间共享并初始化为零。在并发程序中,三个进程在需要全局同步时都会调用屏障函数。
上述实现会起作用吗?我认为如果两个屏障调用立即连续使用可能会导致死锁,因为进入屏障的第一个进程不会等到 process_arrived 变为零才继续执行 P(S)。
【问题讨论】:
-
好吧。如果我们假设在调用 barrier() 之前信号量已经初始化为 1,那么所有 3 个线程都应该在 4 处进入讨厌的自旋状态,除非处理器数量小于 3 并且第一个到达的线程的优先级更高比后一个/s,在这种情况下系统将活锁。如果 3 确实设法在循环中出现,则将在 5 处获得锁并通过,将 process_left 设置为 1,但将 process_arrived 设置为 3。然后它可以释放信号量,做一些事情,循环。再次调用 barrier() 并将 process_arrived 设置为 4....
-
在所有线程都进入屏障之前,不允许线程离开屏障,然后所有线程必须离开屏障,然后任何线程才能再次进入。
-
然后是全局问题..
-
谢谢马丁。进入前检查process_arrived的值,离开前检查process_left的值是否有助于解决这个问题?
-
这可能会迟到,但我有一个问题,如果 2 个进程同时出现,可能不会出现死锁,但随后第三个进程出现并无限期等待 4,因为直到现在 process_arrived = 2。我说的对吗?
标签: multithreading synchronization deadlock thread-synchronization barrier