我正在尝试构建一个程序,在该程序中,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);
}