让pthread等待另一个人的数据

时间:2015-04-28 15:29:43

标签: c++ c pthreads

我正在尝试构建一个程序,其中pthreads等待来自前一个pthread的信号运行,并在完成时发出下一个pthread的信号。

例如,假设我有4个pthreads。 #1首先运行。我希望#2在开始执行之前等待#1完成,并且在完成时,它将发出#3信号。 #3等待#2,最终发出#4信号。完成后#4只是终止。

我如何实现这一目标?

1 个答案:

答案 0 :(得分:3)

对于此问题,您不需要条件变量或互斥锁。 pthread_join()就足够了。

将前一个线程的线程ID传递给其后继线程。允许继任者调用pthread_join(),等待其前任完成。

main()只需要在最后一个帖子上pthread_join()

但是,如评论中所述,在单个线程中可以更有效地实现功能。

C中的解决方案可能类似于:

static void
wait_for_thread(pthread_t *t)
{
    if (t) {
        pthread_join(*t, 0);
        printf("Thread %zu finished...\n", t - threads);
    }
}

static void *
thread_fun(void *arg)
{
    wait_for_thread(arg);
    /* ... */
    return 0;
}

int main ()
{
    int i;
    for (i = 0; i < 4; ++i) {
        pthread_create(&threads[i], 0, thread_fun, i ? &threads[i-1] : 0);
    }
    wait_for_thread(&threads[3]);
    return 0;
}

C ++中的解决方案可能类似于:

int main ()
{
    std::array<std::thread, 4> threads;
    auto wait_for_thread = [&threads](int p) {
        if (p >= 0) {
            threads[p].join();
            std::cout << "Thread " << p << " finished...\n";
        }
    };
    auto thread_fun = [&wait_for_thread](int p) {
        wait_for_thread(p);
        //...
    };

    for (auto &t : threads) {
        t = std::thread(thread_fun, &t-&threads[0]-1);
    }
    wait_for_thread(3);
}