为什么`pthread`没有输出?

时间:2016-06-29 06:19:59

标签: c++ c pthreads

#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没有必要。所以,我在想。

4 个答案:

答案 0 :(得分:3)

您需要在pthread_join()之后致电pthread_exit()pthread_create(),否则main()将返回杀死衍生线程。所以没有输出会打印出来。

答案 1 :(得分:2)

您应该添加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启动另一个pthread2循环5秒钟。在这种情况下,不使用pthread_join

答案 2 :(得分:2)

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

这样做会阻止进程与所有的线程在main()返回的那一刻结束。

答案 3 :(得分:1)

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

您可以通过各种方式解决此问题。正如其他人所提到的,你可以等到线程用pthread_join运行完毕,你可以让线程向main表明它们是通过管道,信号量,屏障,条件变量和其他几种方式完成的。你必须确保main在线程完成之前无法返回,否则你很可能只是在它们有机会运行之前杀死它们。

pthread_join没有必要,因为你提到的答案就是这样。这是您等待线程完成运行的最简单方法。严格地说,您甚至不需要等待线程完成运行,您只需要它们向主线程指示它们已完成您希望它们执行的操作并且线程完成是最简单的方法来了解它他们已经开始了。