首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不等待pthread_barrier_wait()的情况下使用pthread_barrier_destroy()

如何在不等待pthread_barrier_wait()的情况下使用pthread_barrier_destroy()
EN

Stack Overflow用户
提问于 2021-11-11 19:01:59
回答 2查看 63关注 0票数 0

我有一个多线程应用程序,它使用屏障来同步工作线程。

在compute()函数的末尾,线程被取消:

代码语言:javascript
复制
...
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()没有返回,我怎么还能销毁呢?

EN

回答 2

Stack Overflow用户

发布于 2021-11-11 20:10:56

你的问题的答案是:你不能。

  1. man pthread_barrier_destroy

如果在屏障上阻塞任何线程时调用pthread_barrier_destroy(),则

结果未定义

  1. man pthread_cancel

在Linux上,取消是使用信号实现的。

  1. man pthread_barrier_wait

如果将信号传递到屏障上被阻塞的线程,则在从信号处理程序返回时,如果屏障等待尚未完成(即,如果在信号处理程序的执行过程中,所需数量的线程尚未到达屏障),则线程应恢复在屏障处等待;否则,线程应从完成的屏障等待中正常继续。在信号处理程序中的线程从该屏障返回之前,未指定其他线程是否可以在所有线程都到达该屏障后越过该屏障。

在屏障上被阻塞的线程不应阻止任何有资格使用相同处理资源的未被阻塞的线程最终在其执行中取得前进的进展。处理资源的资格应由调度策略确定。

票数 3
EN

Stack Overflow用户

发布于 2021-11-11 20:47:01

正如问题所提出的:

等待的问题是:即使

()没有返回,我怎么还能销毁呢?

正如your other answer解释的那样,答案是“你不能”。

但是,有了足够好的记录保存,您可以启动足够的额外线程专门在屏障上等待,以便让任何其他已经在等待的线程通过。这可能会与代码和数据捆绑在一起,以便让您的线程干净地关闭,而不是被取消,这也是您应该做的事情。

这将是我的建议。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69933565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档