同步不在循环中的线程会发生啥

Posted

技术标签:

【中文标题】同步不在循环中的线程会发生啥【英文标题】:What happens with threads that synchronization not are in the loop同步不在循环中的线程会发生什么 【发布时间】:2016-05-14 13:45:16 【问题描述】:
if(tid < size)
    function1();
    __syncthreads(); //In this synchronization, all threads will waiting here or only threads that enter in statement if?

__syncthreads();

我知道 __syncthreads() 会等待所有线程块,但是如果同步只对部分线程可见会发生什么?

【问题讨论】:

【参考方案1】:

如果同步只对部分线程可见,会发生什么?

一般来说,这是__syncthreads() 的非法用例,the documentation 对此进行了介绍:

__syncthreads() 允许在条件代码中使用,但前提是条件在整个线程块中的计算结果相同,否则代码执行可能会挂起或产生意外的副作用。

因此,您在if 语句中建议使用的结果将是undefined(假设某些线程的tid 大于或等于size)。

还有其他讨论here,你的问题可以说是那个问题的重复。我不想争论问题是否实际上是重复的(丢弃的线程与排除的线程),所以我提供了与那个问题相关的这个 CW 答案。

如果有人想将此标记为重复,我将删除此答案。

【讨论】:

如果未定义,那么一些线程将等待,根据 function1() 中的内容,可能会导致死锁(可能是无限循环)? 未定义意味着您无法预测行为,我也不能。我无法回答有关未定义行为时会发生什么的问题。我的回答不是基于function1() 的任何特征。文档明确指出挂起(可能来自死锁)是可能的结果。

以上是关于同步不在循环中的线程会发生啥的主要内容,如果未能解决你的问题,请参考以下文章

多线程,如果线程崩溃,应用程序会发生啥

如果某些线程比其他线程先结束会发生啥?

线程同步

深入理解Java中的锁

jmeter线程组中的循环与循环控制器中的循环各代表啥含义?

如果 ThreadPool 线程死亡会发生啥?