gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:02:53 24 4
gpt4 key购买 nike

编辑:我错误地假设线程实际上是在 pthread_create 上开始运行时才在 pthread_join 上运行。


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

所以,在代码示例中,main 的 exit(0) 直到两个启动的线程都结束才到达。
但是在第一次调用 pthread_join() 之后,main 继续执行,因为第二次调用 pthread_join() 实际运行了,并且打印了中间的消息。
那怎么样? main 是否在两个线程都未完成时继续执行?还是不是?
我知道这不是一种可靠的测试方法,但是第二条测试消息总是在两个线程都完成后打印出来,无论循环有多长。 (至少在我尝试时在我的机器上)

void *print_message_function( void *ptr )
{
char *message = (char *) ptr;
for( int a = 0; a < 1000; ++a )
printf( "%s - %i\n", message, a );
return NULL;
}
//
int main( int argc, char *argv[] )
{
pthread_t thread1, thread2;
char message1[] = "Thread 1";
char message2[] = "Thread 2";
int iret1, iret2;
//
iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1);
iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) message2);
//
pthread_join( thread1, NULL);
printf( "Let's see when is this printed...\n" );
pthread_join( thread2, NULL);
printf( "And this one?...\n" );
//
printf("Thread 1 returns: %d\n",iret1);
printf("Thread 2 returns: %d\n",iret2);
exit(0);
}

最佳答案

pthread_join 函数等待线程完成,如果线程已经完成则立即返回。

所以在你的情况下

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. */

But after the first call to pthread_join(), main continues executing, because the second call to pthread_join() actually runs, and the message in between is printed.

错了。 pthread_join 等待,除非 thread1 已经完成。

关于c++ - pthread_join() 是否允许调用线程继续执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7955752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com