让 pthread 等待另一个数据



我正在尝试构建一个程序,在该程序中,pthread等待上一个pthread的信号运行,并在它们完成时向下一个ptthread发出信号。

例如,假设我有4个pthread#1先跑。我希望#2在#1开始执行之前等待它完成,完成后,它将发出#3的信号#3等待#2并且最终发信号给#4#4在完成时简单地终止。

我该如何做到这一点?

对于这个问题,您不需要条件变量或互斥。CCD_ 1就足够了。

将前一个线程的线程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);
}

最新更新