为什么加入一个线程最终会调用多个线程?

时间:2019-04-11 16:24:12

标签: multithreading process pthreads

我正在学习线程以及在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的代码。

3 个答案:

答案 0 :(得分:6)

pthread_join等待线程退出,pthread_create创建并启动线程,无论是否加入该线程。

在您的示例中,程序中有3个线程(包括主线程)。但是,如果正在执行main函数的主线程在另外2个线程之前退出,则整个程序将终止,并且其他线程可能没有机会输出任何内容。

最重要的是,您应该记住,程序线程的执行顺序是不确定的,这包括但不一定保证同时执行。因此,在您的示例中,当您仅等待主线程中的另一个线程时,无法确定第二个其他线程在等待第一个线程时是否有机会运行(并退出)。

如果由于某种原因,您只希望运行一个线程,则应该仅启动一个线程(显然是:))或采用某种同步机制(例如mutexcondition variable)将使第二个线程在完成其工作之前等待某种条件发生。

答案 1 :(得分:3)

pthread_join函数只是使调用pthread_join的线程等待,直到它加入的线程完成执行。在进入main的线程等待线程1完成执行的同时,线程1和2可以运行。

该代码具有竞争条件。它永远不会等待线程2完成。因此输出可能无法预测。例如,名为main的线程可能会从main返回并在线程2有机会开始之前终止进程。

答案 2 :(得分:0)

以下建议的代码:

  1. 干净地编译
  2. 执行所需的功能
  3. 在程序退出之前正确等待线程退出
  4. thread函数使用正确的签名
  5. 正确退出thread函数
  6. 正确处理每个线程函数的函数参数
  7. 不包括那些未被使用的头文件

现在,建议的代码:

#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 );
}