【问题标题】:pthread_join function in cc中的pthread_join函数
【发布时间】:2015-03-14 14:58:48
【问题描述】:

我对 pthread_join() 有问题,希望大家回答。 我正在运行下面的程序,并且有一行要打印出来。之后,我尝试删除“pthread_join(th,&val),并且没有要打印的行。

我发现程序中的所有功能,但我不明白为什么。

你能帮我吗,我很感激所有的答案。

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

#define SMALL_STACK 131072

pthread_attr_t thread_attr;
void* fn(void* arg);
int main(int argc, char** argv)
{
    pthread_attr_init(&thread_attr);
    pthread_attr_setstacksize(&thread_attr, SMALL_STACK);

    pthread_t th;

    pthread_create(&th, &thread_attr, fn, (void*)14);
    void* val;
    pthread_join(th, &val);

    return 0;
}

void* fn(void* arg)
{
    printf("arg = 0x%x\n", (int)arg);
    return NULL;
}

【问题讨论】:

    标签: c pthread-join


    【解决方案1】:

    是的,这就是pthread_join 的目的。它让调用线程等待,直到创建的线程完成其工作。如果你没有它,你的main 线程会在你的fn 线程有机会打印之前终止整个进程。

    如果出于某种原因您想终止 main 线程并保持该进程的所有其他线程运行,则必须使用 pthread_exit 终止它,而不是使用 return 语句或调用exit.

    【讨论】:

    • 感谢您的回答。有几点我还是不明白。你说:“如果你没有它,你的主线程会在你的 fn 线程有机会打印之前终止整个进程。”正如你的意思,虽然没有 pthread_join(),fn() 仍然有机会被调用(意味着有打印的行)。我不这么认为,我认为当没有 pthread_join() 时永远不会打印。 pthread_create() 只创建,不执行。我不是以英语为母语的人,希望你能同情。
    • 不,你错了。 pthread_create 启动线程,没有像“创建”一个线程而不执行它这样的事情。那意味着什么?如果您终止 main 函数,则会终止进程,因此同一进程中的 所有 个线程。
    • Pthread_create 启动线程,之后,线程将在调用 fn 函数的情况下执行。但是 main 函数提前终止,所以线程还没有执行 fn 函数(没有打印行)。 Pthread_join() 等待线程在终止主函数之前完成。我说的对吗?
    • 差不多。线程开始执行fn,但在为printf 进行计算的过程中,进程终止。 printf 是一个缓慢的函数,输出需要一些时间才能到达您的终端。
    • 现在,我明白了。我有个问题 。你怎么知道的,我看了很多文件都没有发现你说的?希望您提供相关文件。
    猜你喜欢
    • 2020-06-12
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 2021-07-18
    • 2013-01-16
    相关资源
    最近更新 更多