为啥“pthread”没有输出?

     2023-02-16     19

关键词:

【中文标题】为啥“pthread”没有输出?【英文标题】:why there is no output for `pthread`?为什么“pthread”没有输出? 【发布时间】:2016-06-29 06:19:58 【问题描述】:
#include <pthread.h>
#include <stdio.h>

typedef struct thread_char_para 
    char character;
    int count;
 thread_char_para;

void* char_print (void* parameter)

    thread_char_para* p = (thread_char_para*)parameter;
    int i;
    for (i = 0; i < p->count; ++i)
        fputc(p->character, stderr);
    return NULL;

int main()

    pthread_t thread1;
    pthread_t thread2;
    thread_char_para para1 = 'x', 30000;
    thread_char_para para2 = 'o', 30000;

    pthread_create(&thread1, NULL, char_print, &para1);
    pthread_create(&thread2, NULL, char_print, &para2);

    return 0;

为什么没有任何输出?

我还找到了一些阅读链接:Detached vs. Joinable POSIX threads

在这个链接中,它说pthread_join 不是必需的。所以,我想知道。

【问题讨论】:

如果不使用pthread_join,程序可能会在线程运行之前退出 查看您的历史记录,您也可以通过your previous question得到答案 【参考方案1】:

您需要在pthread_create() 之后调用pthread_join()pthread_exit(),否则main() 也会返回杀死生成的线程。所以没有输出会被打印出来。

【讨论】:

此外,如果您从 main() 调用 pthread_exit(),它将允许生成的线程继续执行,仅终止主线程。如果您以 pthread_exit() 结束 main,则您明确表示您希望其他线程继续。 当主线程被pthread_exit杀死时,拥有主线程的进程呢?它被杀了吗? @BlackMamba: pthread_exit() 不会“杀死”线程,它会以明确定义的方式退出。【参考方案2】:

作为连接两个线程的替代方法,可以将main()-线程视为任何其他线程,并使用pthread_exit() 使其退出。

这样做会阻止进程及其所有线程在main() 返回时结束。

【讨论】:

【参考方案3】:

您应该添加pthread_join 调用以确保您的main 函数等待其他线程完成:

int main()

    pthread_t thread1;
    pthread_t thread2;
    thread_char_para para1 = 'x', 30000;
    thread_char_para para2 = 'o', 30000;

    pthread_create(&thread1, NULL, char_print, &para1);
    pthread_create(&thread2, NULL, char_print, &para2);

    pthread_join(thread1, NULL);  // <--\ add these
    pthread_join(thread2, NULL);  // <--/   two lines.

    return 0;

为您举例说明何时可以避免 pthread_join,请查看以下代码

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

typedef struct thread_char_para 
    char character;
    int count;
 thread_char_para;

void* char_print (void* parameter)

    thread_char_para* p = (thread_char_para*)parameter;
    int i;

    if (p->character == 'x')
    
        pthread_t thread2;
        thread_char_para para2 = 'o', 30000;
        pthread_create(&thread2, NULL, char_print, &para2);

        for (i = 0; i < 5; ++i)
        
            sleep(1);
        
    
    else
    
        for (i = 0; i < p->count; ++i)
            fputc(p->character, stderr);
    
    return NULL;

int main()

    pthread_t thread1;
    thread_char_para para1 = 'x', 30000;

    pthread_create(&thread1, NULL, char_print, &para1);

    pthread_join(thread1, NULL);

    return 0;

如您所见,main 启动 pthread1 并等待 pthread1 完成。 pthread1 启动另一个 thread2 循环 5 秒,而 pthread2 正在执行其工作。在这种情况下,不使用pthread_join

【讨论】:

***.com/questions/3756882/…,在这个链接中,它说pthread_join 是不必要的。 这里需要它,因为当 main() 返回时,应用程序将关闭。所以它必须等到线程完成执行 正如@Twinkle 在主程序完成时所说,应用程序关闭并终止所有线程。 此外,如果您从 main 调用 pthread_exit(),它将允许生成的线程继续执行,仅终止主线程。如果您以 pthread_exit() 结束 main,则您明确表示您希望其他线程继续。 @Twinkle 我想知道,哪个情况需要,哪个不需要?我很困惑。【参考方案4】:

main 函数返回等效于调用exit。它杀死进程及其所有线程。因此,您的程序在线程有机会运行之前将其杀死。 pthread_create 并不意味着线程在pthread_create 内部执行,这意味着该线程将在未来的某个时间执行,而创建线程后您要做的第一件事就是杀死它们,这很可能他们还没有机会开始跑步。

您可以通过多种方式解决此问题。正如其他人所提到的,您可以等到线程使用pthread_join 完成运行,您可以让线程向 main 指示它们是通过管道、信号量、屏障、条件变量和许多其他方式完成的。你只需要确保main 在线程完成之前不能返回,否则你很可能会在它们有机会运行之前杀死它们。

pthread_join 没有必要,正如您所指的答案所说。在您的情况下,这只是等待线程完成运行的最简单方法。严格来说,你甚至不需要等待线程完成运行,你只需要它们向主线程表明它们已经完成了你想让它们做的事情,而线程完成是知道这一点的最简单方法他们已经开始了。

【讨论】:

为啥 pthread 会导致内存泄漏

】为啥pthread会导致内存泄漏【英文标题】:whypthreadcausesamemoryleak为什么pthread会导致内存泄漏【发布时间】:2013-07-1214:53:36【问题描述】:每当我创建一个pthread时,valgrind都会输出内存泄漏,例如下面的代码:#include<stdio.h>#i... 查看详情

为啥 CMake 似乎没有使用 add_compile_options 命令应用 -pthread?

】为啥CMake似乎没有使用add_compile_options命令应用-pthread?【英文标题】:WhyCMakedoesnotseemtoapply-pthreadusingadd_compile_optionscommand?为什么CMake似乎没有使用add_compile_options命令应用-pthread?【发布时间】:2014-10-1315:08:36【问题描述】:我... 查看详情

pthread.h不属于linux内核,但是为啥很多内核源码中include了pthread.h

换句话说,既然内核中没有pthread.h,但是内核中又有文件include了pthread.h,那内核编译怎么通过?加入头文件,是声明这个函数是被定义过的,就如同要使用stdio.h里的函数一样,没有stdio.h头文件,stdio.h里的函数一样不可用;使... 查看详情

pthread为啥规定cond要和mutex一起使用

...变量保护的,锁住互斥变量后才能计算条件。参考技术Apthread_cond_wait总和一个互斥锁结合使用。在调用pthread_cond_wait前要先获取锁。pthread_cond_wait函数执行时先自动释放指定的锁,然后等待条件变量的变化。在函数调用返回之前... 查看详情

为啥 pthread 的条件变量函数需要互斥锁?

】为啥pthread的条件变量函数需要互斥锁?【英文标题】:Whydopthreads’conditionvariablefunctionsrequireamutex?为什么pthread的条件变量函数需要互斥锁?【发布时间】:2010-05-0408:05:01【问题描述】:我正在阅读pthread.h;条件变量相关函数... 查看详情

为啥 pthread_key 需要析构函数?

】为啥pthread_key需要析构函数?【英文标题】:Whypthread_keyneeddestructor?为什么pthread_key需要析构函数?【发布时间】:2020-01-0612:48:54【问题描述】:我正在阅读APUE关于线程特定数据的章节。我看到以下代码片段:voiddestructor(void*);p... 查看详情

为啥在 pthread_detach() 之后调用 pthread_exit() 在极少数情况下会导致 SEGV?

】为啥在pthread_detach()之后调用pthread_exit()在极少数情况下会导致SEGV?【英文标题】:Whydoespthread_exit()inrarecasescauseaSEGVwhencalledafterpthread_detach()?为什么在pthread_detach()之后调用pthread_exit()在极少数情况下会导致SEGV?【发布时间】:20... 查看详情

为啥我没有任何输出?

】为啥我没有任何输出?【英文标题】:Whydon\'tIgetanyoutput?为什么我没有任何输出?【发布时间】:2015-06-1320:38:10【问题描述】:我正在尝试用C++编写我的第一个OOP代码,但由于某种原因,我没有得到任何输出。我正在尝试创建... 查看详情

为啥 pthread_join() 的第二个参数是一个**,一个指向指针的指针?

】为啥pthread_join()的第二个参数是一个**,一个指向指针的指针?【英文标题】:Whythesecondargumenttopthread_join()isa**,apointertoapointer?为什么pthread_join()的第二个参数是一个**,一个指向指针的指针?【发布时间】:2018-04-2315:27:20【问题... 查看详情

为啥这些并行进程的输出没有混乱?

】为啥这些并行进程的输出没有混乱?【英文标题】:Whyistheoutputfromtheseparallelprocessesnotmessedup?为什么这些并行进程的输出没有混乱?【发布时间】:2016-03-1106:53:14【问题描述】:一切都在完美执行。words.dict文件每行包含一个单... 查看详情

为啥我会收到“错误:‘pthread_delay_np’未在此范围内声明”?

】为啥我会收到“错误:‘pthread_delay_np’未在此范围内声明”?【英文标题】:WhydoIget"error:‘pthread_delay_np’wasnotdeclaredinthisscope"?为什么我会收到“错误:‘pthread_delay_np’未在此范围内声明”?【发布时间】:2010-11-2915:... 查看详情

为啥分离线程没有输出消息?

】为啥分离线程没有输出消息?【英文标题】:whydoesdetachthreadgetnooutputmessage?为什么分离线程没有输出消息?【发布时间】:2019-11-2109:01:23【问题描述】:我正在测试如下的cpp代码,并得到一个非常令人困惑的现象,下面的代码... 查看详情

为啥 QDatastream 没有给出正确的输出

】为啥QDatastream没有给出正确的输出【英文标题】:WhyQDatastreamisnotgivingthecorrectoutput为什么QDatastream没有给出正确的输出【发布时间】:2020-04-1506:19:24【问题描述】:在给定的代码中,我首先在流中插入1个数字,然后将该值放入... 查看详情

为啥这段代码没有输出预期的结果?

】为啥这段代码没有输出预期的结果?【英文标题】:Whyisthiscodenotoutputtingexpectedresult?为什么这段代码没有输出预期的结果?【发布时间】:2019-11-1409:04:06【问题描述】:我有以下jQuery构建嵌套DOM元素并将其附加到当前DOM。但结... 查看详情

为啥调用 fork() 比调用 pthread_create() 需要更长的时间?

】为啥调用fork()比调用pthread_create()需要更长的时间?【英文标题】:Whydoesittakelongertocallafork()thanitdoestocallpthread_create()?为什么调用fork()比调用pthread_create()需要更长的时间?【发布时间】:2011-02-1418:42:44【问题描述】:我想知道... 查看详情

为啥 Javascript sort() 函数没有给出预期的输出? [复制]

】为啥Javascriptsort()函数没有给出预期的输出?[复制]【英文标题】:WhyJavascriptsort()functionisnotgivingtheexpectedoutput?[duplicate]为什么Javascriptsort()函数没有给出预期的输出?[复制]【发布时间】:2012-08-0812:33:19【问题描述】:可能重复... 查看详情

为啥“cal”命令的输出没有突出显示日期?

】为啥“cal”命令的输出没有突出显示日期?【英文标题】:Whydoesn\'ttheoutputofthecommand`cal`havethedayhighlighted?为什么“cal”命令的输出没有突出显示日期?【发布时间】:2021-08-1910:15:48【问题描述】:我需要命令cal的输出在变量中... 查看详情

为啥使用 std::mutex 的函数对 pthread_key_create 的地址进行空检查?

】为啥使用std::mutex的函数对pthread_key_create的地址进行空检查?【英文标题】:Whydofunctionsusingstd::mutexmakeanullcheckoftheaddressofpthread_key_create?为什么使用std::mutex的函数对pthread_key_create的地址进行空检查?【发布时间】:2017-09-2216:54:14... 查看详情