我正在重新使用pthread,并且pthread_join的定义让我感到困扰。
它说:“pthread_join()函数将挂起调用线程的执行,直到目标线程终止,除非目标线程已经终止。从成功的pthread_join()调用返回时,通过终止线程传递给pthread_exit()的值将在value_ptr引用的位置中提供。当pthread_join()成功返回时,目标线程已被终止。同时指定相同目标线程的多个同时调用pthread_join()的结果是未定义的。如果调用pthread_join()的线程被取消,则目标线程不应该分离。”
我试图理解如何在调用pthread_join以启动第二个线程之前,调用pthread_join来为一个线程调用,即使我想象中,第一个join已经挂起了主线程的执行并阻止了下一行的运行,直到从加入的线程内部调用pthread_exit。
特别地,我想象中,第一个pthread_join必须等待指定的线程调用pthread_exit,然后它才能继续。但是这并不是情况,因为我可以这样做:
忽略可能的竞态条件尝试减少代码大小,为什么两个线程都在工作,尽管第一个 join 暂停了主线程(因此,在我的看法中阻止了下一个 join 被调用)。
我真的很想了解这是如何工作的。
提前感谢。
它说:“pthread_join()函数将挂起调用线程的执行,直到目标线程终止,除非目标线程已经终止。从成功的pthread_join()调用返回时,通过终止线程传递给pthread_exit()的值将在value_ptr引用的位置中提供。当pthread_join()成功返回时,目标线程已被终止。同时指定相同目标线程的多个同时调用pthread_join()的结果是未定义的。如果调用pthread_join()的线程被取消,则目标线程不应该分离。”
我试图理解如何在调用pthread_join以启动第二个线程之前,调用pthread_join来为一个线程调用,即使我想象中,第一个join已经挂起了主线程的执行并阻止了下一行的运行,直到从加入的线程内部调用pthread_exit。
特别地,我想象中,第一个pthread_join必须等待指定的线程调用pthread_exit,然后它才能继续。但是这并不是情况,因为我可以这样做:
#include <pthread.h>
#include <stdio.h>
int avail = 0;
void *consumer(void *unused)
{
while (1) {
if (avail > 0) {
--avail;
puts("consumed");
}
}
}
void *producer(void *unused)
{
while (1) {
++avail;
puts("produced");
}
}
int main(int argc, char **argv)
{
pthread_t c_thread;
pthread_t p_thread;
pthread_create(&c_thread, 0, consumer, 0);
pthread_create(&p_thread, 0, producer, 0);
pthread_join(c_thread, 0);
pthread_join(p_thread, 0);
return 0;
}
忽略可能的竞态条件尝试减少代码大小,为什么两个线程都在工作,尽管第一个 join 暂停了主线程(因此,在我的看法中阻止了下一个 join 被调用)。
我真的很想了解这是如何工作的。
提前感谢。
pthread_join()
来等待一个线程结束,然后再调用pthread_join()
来等待第二个线程结束。但是需要注意的是,pthread_join()
并不会创建线程。另外,你的“问题”缺乏对你所看到的和期望看到的情况的精确描述。请注意,你对所看到的内容的解释比实际看到的内容更不重要。 - Ulrich Eckhardtscanf()
等待输入,或者设置一个断点。调度程序在创建线程后不会立即切换到另一个线程。也就是说,你可以轻松地检查第二个pthread_join()
是否被调用,或者至少第一个是否返回。 - Ulrich Eckhardtpthread_join
时特指您所指定的线程。被指定的线程的用户代码也不必直接调用pthread_exit
,它可以简单地使用return something;
(请参见此 man 页面中的项目符号)。虽然这对于您来说可能不那么重要,但对于 C++ 程序员而言是极为重要的。 - WhozCraig