C++ pthread_join()是否允许继续执行调用线程?

C++ pthread_join()是否允许继续执行调用线程?,c++,c,multithreading,pthreads,C++,C,Multithreading,Pthreads,编辑: 我错误地假设线程开始在pthread\u join上运行,而实际上开始在pthread\u create上运行 我正在学习使用Posix线程,我已经读到: pthread_join()-等待线程终止 因此,在代码示例中,只有在两个启动的线程结束后,才能到达main的出口(0)。 但是在第一次调用pthread_join()之后,main将继续执行,因为第二次调用pthread_join()实际上会运行,并且会打印中间的消息。 这怎么样?当两个线程还没有完成时,main是否继续执行?是吗

编辑: 我错误地假设线程开始在
pthread\u join
上运行,而实际上开始在
pthread\u create
上运行


我正在学习使用Posix线程,我已经读到:
pthread_join()-等待线程终止

因此,在代码示例中,只有在两个启动的线程结束后,才能到达main的出口(0)。
但是在第一次调用pthread_join()之后,main将继续执行,因为第二次调用pthread_join()实际上会运行,并且会打印中间的消息。
这怎么样?当两个线程还没有完成时,main是否继续执行?是吗?
我知道这不是一种可靠的测试方法,但第二条测试消息总是在两个线程完成后打印出来,不管循环有多长。(至少在我的机器上试用过)

void*打印消息功能(void*ptr)
{
字符*消息=(字符*)ptr;
对于(int a=0;a<1000;++a)
printf(“%s-%i\n”,消息,a);
返回NULL;
}
//
int main(int argc,char*argv[])
{
pthread_t thread1,thread2;
char message1[]=“线程1”;
char message2[]=“线程2”;
int iret1,iret2;
//
iret1=pthread_create(&thread1,NULL,print_message_函数,(void*)message1);
iret2=pthread_create(&thread2,NULL,print_message_函数,(void*)message2);
//
pthread_join(thread1,NULL);
printf(“让我们看看这是什么时候打印的…\n”);
pthread_join(thread2,NULL);
printf(“这一个呢?…\n”);
//
printf(“线程1返回:%d\n”,iret1);
printf(“线程2返回:%d\n”,iret2);
出口(0);
}

函数
pthread\u join
等待线程完成,或者如果线程已经完成,则立即返回

pthread_join( thread1, NULL);
那么你的情况呢

pthread_join( thread1, NULL); /* Start waiting for thread1. */
printf( "Let's see when is this printed...\n" ); /* Done waiting for thread1. */

pthread_join( thread2, NULL); /* Start waiting for thread2. */
printf( "And this one?...\n" ); /* Done waiting for thread2. */
但是在第一次调用pthread_join()之后,main继续执行, 因为对pthread_join()的第二个调用实际上是运行的,而 中间的消息被打印出来

pthread_join
等待,除非thread1已经完成

pthread_join( thread1, NULL);
主线程在此连接调用中等待,直到
thread1
完成其作业。一旦
thread1
完成执行,主线程将继续执行下一条语句
printf

printf( "Let's see when is this printed...\n" );
同样,主线程将在这里等待,直到
thread2
完成其工作

pthread_join( thread2, NULL); 
thread2
完成其工作后,主线程向前移动,并执行下一条语句,即
printf

printf( "And this one?...\n" );
该序列将以上述方式工作。这种情况可能发生得太快,以至于您看到的轨迹使其变得混乱。
另外,不要使用
printf
查看多线程程序的行为可能会产生误导,printf的顺序可能并不总是指示正确的控制流,因为它是基于时间的,并且在跨线程执行打印时,缓冲区到标准输出的刷新可能不会按sasme顺序进行。

pthread\u join()
在被加入的线程终止之前不会返回(阻止调用线程)。如果线程已经终止,那么它会立即返回


在测试中,两个线程都会退出,因此您当然会看到从主线程打印的所有消息。打印第一条消息时,您知道
thread1
已完成;打印第二个时,您知道
thread2
也已完成。这可能会在第一个线程之后很快发生,因为两个线程在几乎相同的时间做相同的工作量。

如果第一个pthread_join立即返回,则表明第一个线程已经完成了执行。输出是什么样子的?在“让我们看看何时打印”之后,您是否看到任何“线程1-n”输出?

哦,对了,因为线程已经在pthread_create上启动了。谢谢