Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在同一个CPU上的两个超线程之间会有竞争吗?_Multithreading_Race Condition_Hyperthreading - Fatal编程技术网

Multithreading 在同一个CPU上的两个超线程之间会有竞争吗?

Multithreading 在同一个CPU上的两个超线程之间会有竞争吗?,multithreading,race-condition,hyperthreading,Multithreading,Race Condition,Hyperthreading,我试图在我的代码中避免竞争条件,目前我使用的是一个超线程CPU,因此有两个逻辑CPU,每个CPU都有自己的线程。如果我对超线程的理解是正确的,那么这些线程共享相同的资源,但它们的操作实际上是时间切片的,而不是并发的。这两个超线程之间还可能出现竞争条件吗 例如,我是否有理由改变这一点: Connection& connection = connections[num_connections]; ... do some stuff ++num_connections; 为此: Connec

我试图在我的代码中避免竞争条件,目前我使用的是一个超线程CPU,因此有两个逻辑CPU,每个CPU都有自己的线程。如果我对超线程的理解是正确的,那么这些线程共享相同的资源,但它们的操作实际上是时间切片的,而不是并发的。这两个超线程之间还可能出现竞争条件吗

例如,我是否有理由改变这一点:

Connection& connection = connections[num_connections];
... do some stuff
++num_connections;
为此:

Connection& connection = connections[num_connections++];
... do some stuff
这是可能的

如果两个线程都执行如下逻辑

if(condition){
 donate1MillionDollars
 condition=false
}
即使使用时间切片,这两个线程也可以进入if块,并且您会变得比预期的差很多:)

如果不知道“做一些事情”意味着什么,就很难专门针对您的用例来回答。

这是可能的

如果两个线程都执行如下逻辑

if(condition){
 donate1MillionDollars
 condition=false
}
即使使用时间切片,这两个线程也可以进入if块,并且您会变得比预期的差很多:)


如果不知道“做一些事情”意味着什么,就很难专门针对您的用例来回答。

因为您无法控制线程之间的事件顺序,或者线程何时被抢占,当然争用条件可能会导致失败


竞态条件生成的失败不需要同时执行。

由于无法控制线程之间的事件顺序,或者线程将被抢占的时间,当然竞态条件会导致失败


竞态条件生成的故障不需要同时执行。

a)线程环境隐藏了超线程和线程之间的区别。b) 这两种代码构造都不是线程安全的。你需要做更多的研究。比赛只需要时间分割。在unicore CPU上进行时间切片时,不存在不可再现的竞争。@usr不想回避这个问题本身,但在具有宽松内存模型的系统上,这完全是真的吗?我认为对单核进行时间切片只能在多核系统上模拟顺序一致性。我不知道它如何模拟只能由内存重新排序引起的竞争条件。回到手头的问题,我不知道英特尔是否对同一内核上的超线程之间的内存重新排序有任何说法。但很明显,程序员必须假设最坏的情况。。。你说得对@另一方面,编译器可以像CPU一样重新排序,对吗?我一直认为这两个人的能力是一样的。我想这是赫伯·萨特的“原子武器”谈话。当然C++中由于未定义的行为是正确的。@ USR是的,编译器的东西是完全不同的。但是你是对的,这一切都在UB的保护伞下。a)超线程和线程的区别被线程环境隐藏了。b) 这两种代码构造都不是线程安全的。你需要做更多的研究。比赛只需要时间分割。在unicore CPU上进行时间切片时,不存在不可再现的竞争。@usr不想回避这个问题本身,但在具有宽松内存模型的系统上,这完全是真的吗?我认为对单核进行时间切片只能在多核系统上模拟顺序一致性。我不知道它如何模拟只能由内存重新排序引起的竞争条件。回到手头的问题,我不知道英特尔是否对同一内核上的超线程之间的内存重新排序有任何说法。但很明显,程序员必须假设最坏的情况。。。你说得对@另一方面,编译器可以像CPU一样重新排序,对吗?我一直认为这两个人的能力是一样的。我想这是赫伯·萨特的“原子武器”谈话。当然C++中由于未定义的行为是正确的。@ USR是的,编译器的东西是完全不同的。但你是对的,一切都在UB的保护伞下。