【发布时间】:2021-12-24 05:59:49
【问题描述】:
我有一个使用屏障来同步工作线程的多线程应用程序。
在函数compute()结束时,线程被取消:
...
for(int i=0;i<p; i++){
printf("Thread %lu completed in %d passes\n",threads[i],find_tstat(threads[i])->count);
pthread_cancel(threads[i]);
}
printf("================================================================\n");
return a;
线程在计算过程中被中断,因此它们可能位于障碍之间。这可能是导致 pthread_barrier_destroy() 挂起的原因,因为一些 barrier_wait() 尚未返回。
问题是;即使 wait() 没有返回,我怎么还能销毁?
【问题讨论】:
-
您必须向我们展示
compute是如何实现的,顺便说一句。你在哪里创建你的线程,你的线程启动函数是什么以及你如何以及在哪里使用pthread_barrier_wait。总之,你必须提供更多的代码。 -
@ErdalKüçük 我可以告诉你,destroy() 挂起的原因是,在某些时候,线程将在 pthread_barrier_wait() 上的所有同步之前被销毁。所以,问题是,即使 wait() 没有返回,我怎么还能销毁呢?
-
我已更改问题以反映这一点
-
使用
pthread_cancel()通常是个坏主意。最好有一种方法来通知线程它应该完全停止。例如,设置线程定期检查的原子变量。
标签: c multithreading pthreads