嗯,我觉得我可以用笨拙的方法做到这一点...
让“屏障”成为自己监听套接字的进程。将barrier_wait实现为:
open connection to barrier process
send message telling barrier process I am waiting
block in read() waiting for reply
一旦有N个线程在等待,屏障进程会告诉它们都可以继续执行。然后每个等待的线程关闭与屏障进程的连接并继续进行。
将barrier_destroy实现为:
open connection to barrier process
send message telling barrier process to go away
close connection
一旦所有连接都关闭并且障碍进程已被告知离开,它就会退出。
[编辑:尽管在等待和释放操作中分配和销毁了套接字,但我认为您可以实现相同的协议而不这样做;请参见下文。]
第一个问题:这个协议真的有效吗?我认为它有效,但也许我没有理解要求。
第二个问题:如果它确实有效,是否可以模拟它而不需要额外进程的开销?
我相信答案是“是的”。您可以让每个线程在适当的时间“扮演”障碍进程的角色。您只需要一个主互斥锁,由当前“扮演”障碍进程角色的任何线程持有。细节,细节...好的,所以barrier_wait可能看起来像:
lock(master_mutex);
++waiter_count;
if (waiter_count < N)
cond_wait(master_condition_variable, master_mutex);
else
cond_broadcast(master_condition_variable);
bool do_release = time_to_die && waiter_count == 0;
unlock(master_mutex);
if (do_release)
release_resources();
这里的master_mutex
(一个互斥锁),master_condition_variable
(一个条件变量),waiter_count
(一个无符号整数),N
(另一个无符号整数)和time_to_die
(一个布尔值)都是由barrier_init分配和初始化的共享状态。 waiter_count
初始化为零,time_to_die
初始化为false,N
初始化为等待屏障的线程数。
然后barrier_destroy将是:
lock(master_mutex);
time_to_die = true;
bool do_release = waiter_count == 0;
unlock(master_mutex);
if (do_release)
release_resources();
关于信号处理等所有细节,我不是很确定……但“最后一个离开的人熄灯”这个基本想法是可行的,我认为。
pthread_barrier_destroy
函数只与最后一个等待者同步。那么问题是什么呢? - Hasturkunpthread_barrier_destroy
获取锁,确保销毁成功时没有人访问屏障内部(如果有任何线程正在等待,则不会成功)。 - Hasturkun