我正在学习线程以及在Linux上使用C进行线程编程。我了解的是,加入线程只是调用线程并等待其执行,就像等待子进程运行一样。但是不知道为什么当试图加入一个线程时,它最终会调用两个线程!
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
void *start1()
{
printf("Hello from Thread 1\n");
}
void *start2()
{
printf("Hello from Thread 2\n");
}
void main()
{
pthread_t t1,t2;
pthread_create(&t1,NULL,start1,NULL);
pthread_create(&t2,NULL,start2,NULL);
pthread_join(t1,NULL);
}
运行代码时,输出如下:
[root@localhost]# ./a.out
Hello from Thread 1
Hello from Thread 2
我希望它仅调用start1的代码。
答案 0 :(得分:6)
pthread_join
等待线程退出,pthread_create
创建并启动线程,无论是否加入该线程。
在您的示例中,程序中有3个线程(包括主线程)。但是,如果正在执行main
函数的主线程在另外2个线程之前退出,则整个程序将终止,并且其他线程可能没有机会输出任何内容。
最重要的是,您应该记住,程序线程的执行顺序是不确定的,这包括但不一定保证同时执行。因此,在您的示例中,当您仅等待主线程中的另一个线程时,无法确定第二个其他线程在等待第一个线程时是否有机会运行(并退出)。
如果由于某种原因,您只希望运行一个线程,则应该仅启动一个线程(显然是:))或采用某种同步机制(例如mutex或condition variable)将使第二个线程在完成其工作之前等待某种条件发生。
答案 1 :(得分:3)
pthread_join
函数只是使调用pthread_join
的线程等待,直到它加入的线程完成执行。在进入main
的线程等待线程1完成执行的同时,线程1和2可以运行。
该代码具有竞争条件。它永远不会等待线程2完成。因此输出可能无法预测。例如,名为main
的线程可能会从main
返回并在线程2有机会开始之前终止进程。
答案 2 :(得分:0)
以下建议的代码:
thread
函数使用正确的签名thread
函数现在,建议的代码:
#include <pthread.h>
#include <stdio.h>
//#include <unistd.h>
//#include <stdlib.h>
void *start1( void * arg)
{
(void)arg;
printf( "Hello from Thread 1\n" );
pthread_exit( NULL);
}
void *start2( void* arg)
{
(void)arg;
printf( "Hello from Thread 2\n" );
pthread_exit( NULL );
}
int main( void )
{
pthread_t t1,t2;
pthread_create( &t1, NULL, start1, NULL );
pthread_create( &t2, NULL, start2, NULL );
pthread_join( t1, NULL );
pthread_join( t2, NULL );
}