为什么不能在同一个线程上执行多个pthread_joins?

SHH*_*SHH 4 multithreading posix pthreads pthread-join

来自https://computing.llnl.gov/tutorials/pthreads/:

连接线程可以匹配一个pthread_join()调用.在同一个线程上尝试多个连接是一个逻辑错误.

也来自"man pthread_join":

如果多个线程同时尝试使用同一个线程进行连接,则结果是未定义的.

但是,从程序员的角度来看,多个线程可能希望等待单个线程完成(类似于障碍),这是完全合理的.

例如,我们可能有thread1,thread2独立运行,我们可能希望两个线程都等到thread3完成.

这个限制背后有任何技术原因吗?

pil*_*row 5

我认为技术原因是pthread_join是一个POSIX标准,对于多线程,它试图只为实现者指定必要的原语.任何更丰富的语义都会引入更昂贵的实现,也许会带来更困难的API.

实际上,POSIX已经认为这个函数是一个方便的,而不是一个原始的,支持一个非常非常常见的用例:一个线程等待另一个线程的终止.

POSIX.1-2008 pthread_join RATIONALE的第一段有点冗长,但是有许多相关的观察:

在pthread_join()函数是,在多线程应用程序已经证明是有用的便利.确实,如果没有通过将额外状态作为参数的一部分传递给start_routine()来提供程序员,则可以模拟此函数.终止线程将设置一个标志以指示终止并广播属于该状态的条件; 连接线程将等待该条件变量.虽然这种技术允许线程在更复杂的条件下等待(例如,等待多个线程终止),但是等待单个线程终止被认为是非常有用的.另外,包括pthread_join()函数绝不排除程序员编写这种复杂的等待.因此,虽然不是原始的,包括POSIX.1-2008的这个卷中的pthread_join()被认为是有价值的.