繁体   English   中英

为什么我需要从主线程使用 `pthread_exit()`,而它不是由 `pthread_create` 创建的?

[英]Why do I need to use `pthread_exit()` from the main thread, while it was not created by a `pthread_create`?

我对一些我正在测试以开始理解 posix 线程的代码有疑问。

我有这个基本代码:

#include <iostream>
#include <string>
#include <sstream>
#include <pthread.h>

using namespace std;

void *printInfo(void *thid){
    long tid;
    tid =(long)thid;
    printf("Hello from thread %ld.\n",tid);
    pthread_exit(NULL);
}

int main (int argc, char const *argv[])
{
    int num =8;
    pthread_t threadlist[num];
    int rc;
    long t;
    for(t=0;t<num;t++){
        printf("Starting thread %ld\n",t);
        rc = pthread_create(&threadlist[t],NULL,printInfo,(void *)t);
        if(rc)
        {
            printf("Error creating thread");
            exit(-1);
            
        }
    }
    pthread_exit(NULL);
    return 0;
}

非常简单的代码,启动线程并从中打印,这一切都很神奇,除了我不明白return 0;之前的最后一个pthread_exit(NULL) return 0; 在 main 方法的最后。

似乎主线程不应该是 pthread,而且应该不需要! 如果我不放它,代码就不起作用:代码编译并执行,但我只得到“起始线程”打印消息,而不是“hello from ...”消息。

所以基本上我想知道为什么需要这样做。

此外,如果我注释掉 include <psthread.h> ,代码会编译并正确执行。

如果您不在主函数中使用 pthread_exit,那么所有创建的线程都将在主完成时终止,即在您的情况下,在它们打印任何内容之前。

通过在 main 函数中调用 pthread_exit 使 main 等待所有线程完成。

从 pthread_exit 手册页:

在最后一个线程终止后,进程将以退出状态 0 退出。 行为就像实现调用 exit() 在线程终止时参数为零一样。

这是指从主进程线程调用 pthread_exit()。

pthread_exit只会终止主线程,但会让其他线程运行直到它们完成它们的工作。 而如果您从main返回或调用exit ,这将强制终止所有线程。

你需要加入你的线程。 没有pthread_exit的情况是您已经启动了线程,然后 main 在它实际运行任何线程之前退出。 当 main 退出时,程序停止运行(线程也是如此)。

通常,您会使用pthread_join等待指定的线程完成执行。

似乎pthread_exit导致 main 等待我不知道的所有线程。 但是,我会研究一下,因为它不在文档中(就我所阅读的而言),并且可能不是您想要依赖的东西。

编辑:同样在您的情况下,您根本不需要使用pthread_exit 当执行的函数(在您的情况下为printInfo )返回时,线程将自动终止。 pthread_exit允许您在执行的函数返回之前终止线程,例如,如果执行的函数调用另一个调用pthread_exit函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM