我有一个多线程应用程序,它使用屏障来同步工作线程。
在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()没有返回,我怎么还能销毁呢?
发布于 2021-11-11 20:10:56
你的问题的答案是:你不能。
如果在屏障上阻塞任何线程时调用pthread_barrier_destroy(),则
结果未定义
在Linux上,取消是使用信号实现的。
如果将信号传递到屏障上被阻塞的线程,则在从信号处理程序返回时,如果屏障等待尚未完成(即,如果在信号处理程序的执行过程中,所需数量的线程尚未到达屏障),则线程应恢复在屏障处等待;否则,线程应从完成的屏障等待中正常继续。在信号处理程序中的线程从该屏障返回之前,未指定其他线程是否可以在所有线程都到达该屏障后越过该屏障。
在屏障上被阻塞的线程不应阻止任何有资格使用相同处理资源的未被阻塞的线程最终在其执行中取得前进的进展。处理资源的资格应由调度策略确定。
发布于 2021-11-11 20:47:01
正如问题所提出的:
等待的问题是:即使
()没有返回,我怎么还能销毁呢?
正如your other answer解释的那样,答案是“你不能”。
但是,有了足够好的记录保存,您可以启动足够的额外线程专门在屏障上等待,以便让任何其他已经在等待的线程通过。这可能会与代码和数据捆绑在一起,以便让您的线程干净地关闭,而不是被取消,这也是您应该做的事情。
这将是我的建议。
https://stackoverflow.com/questions/69933565
复制相似问题