【发布时间】:2019-09-10 14:57:44
【问题描述】:
如果我有多个线程并且我想等待一个线程完成,为什么根据 pthread_join() 函数这是未定义的?
例如,下面的代码显示线程 1 和 2 等待线程 0:
void* thread1(void* t1){
..
pthread_join(pthread_t thread0, void **retval1);
return NULL
}
void* thread2(void* t2){
..
pthread_join(pthread_t thread0, void **retval2);
return NULL
}
为什么这种行为是未定义的,或者换句话说是不可能的?
【问题讨论】:
-
我认为这个例子需要代码,因为你在这里似乎有一个误解。两个线程的连接不是对称操作。 IE。如果线程A1加入B,然后线程A2加入B就可以了。这意味着B等待A1完成,然后等待A2完成。不能让 B1 和 B2 都等待线程 A 完成。
-
后一种情况就是我所指的。我将包含代码来说明这一点。
-
顺便说一句,请注意,POSIX 还使线程 B 无法等待
A1 and A2或A1 or A2。你必须等待A1,然后等待A2,如果你不知道哪个会先完成,这有点麻烦。相比之下,Windows 有WaitForMultipleObjects。这远更加灵活。 -
@MSalters 我知道线程只能在 linux 中等待一个线程,但我不明白为什么多个线程不能等待一个线程完成。是什么阻止他们这样做?
-
您是在问为什么不能调用 pthread_join 两次,还是在寻求一种方法来完成您正在尝试做的事情?
标签: c linux multithreading pthreads