我正在尝试构建一个程序,其中pthreads等待来自前一个pthread的信号运行,并在完成时发出下一个pthread的信号。
例如,假设我有4个pthreads。 #1首先运行。我希望#2在开始执行之前等待#1完成,并且在完成时,它将发出#3信号。 #3等待#2,最终发出#4信号。完成后#4只是终止。
我如何实现这一目标?
答案 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);
}