关于pthread_join()和pthread_detach()的问题

时间:2018-12-16 23:51:59

标签: c pthreads

我写了这个程序来练习pthread系统调用,所以我用了一些打印行来检查结果,但是它们被转义了,输出是:

Thread 1 created Thread 2 created test3

我认为应该是

thread 1 created test2 thread 2 created test3 test1 顺序可能会更改,但我应该有这行,为什么要转义此打印语句?

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>



void *function();
void *function2();




int main(int argc, char *argv[])
{
    pthread_t tid;
    int rc;
    rc = pthread_create(&tid, NULL, function(), NULL);
    if(rc > 0){
        fprintf(stderr, "Error\n");
        exit(1);
    }
    pthread_join(tid, NULL);
    sleep(1);
    printf("test1\n");
    pthread_exit(NULL);
}

void *function(){
    int rc;
    pthread_t tid;
    printf("Thread 1 created\n");
    rc = pthread_create(&tid, NULL, function2(), NULL);
    if(rc > 0){
        fprintf(stderr, "Error\n");
        exit(1);
    }
    printf("test2\n");
    pthread_exit(NULL);
}

void *function2(){
    pthread_detach(pthread_self());
    printf("Thread 2 created\n");
    printf("test3\n");
    pthread_exit(NULL);
}

1 个答案:

答案 0 :(得分:3)

rc = pthread_create(&tid, NULL, function(), NULL);

您正尝试使用通过调用pthread_create()返回的指针来调用function()作为要在新线程中运行的函数(请记住,在调用函数本身之前先对函数参数进行评估)。现在,function()实际上并没有返回任何值,但是它在其主体中调用了function2()(同时评估了对另一次pthread_create()的调用的参数), 不返回任何值,但是调用pthread_exit()。由于此时只有一个线程是因为仅运行主进程线程(实际上尚未调用pthread_create();调用堆栈看起来像main() -> function() -> function2()),因此整个程序退出。

您需要使用指向pthread_create()function的指针来调用function2,而不是调用它们的结果:

rc = pthread_create(&tid, NULL, function, NULL);