我已阅读文章同步和多处理器问题,我有一个关于InterlockedCompareExchange和InterlockedExchange的问题.问题实际上是文章中的最后一个例子.它们有两个变量iValue,fValueHasBeenComputed并且在CacheComputedValue()它们中使用InterlockedExchange以下方法修改它们:
InterlockedExchange ((LONG*)&iValue, (LONG)ComputeValue()); // don't understand
InterlockedExchange ((LONG*)&fValueHasBeenComputed, TRUE); // understand
Run Code Online (Sandbox Code Playgroud)
我知道我可以InterlockedExchange用来修改,iValue但它应该只是做
iValue = ComputeValue();
Run Code Online (Sandbox Code Playgroud)
那么实际上是否需要使用InterlockedExchange来设置iValue?或者其他线程即使正确也会看到iValue iValue = ComputeValue();.我的意思是其他线程会正确地看到iValue,因为它InterlockedExchange在它之后.
还有针对Microsoft本机代码平台的基于原理的顺序内存模型.有3.1.1示例或多或少相同的代码.其中一个推荐Make y interlocked.请注意-不能同时y和x.
更新
只是为了澄清这个问题.问题是我看到了一个矛盾."同步和多处理器问题"中的示例使用两个InterlockedExchange.相反,在示例3.1.1"Basic Reodering"(我认为与第一个示例非常相似)中,Herb Sutter给出了这个推荐
"使y互锁:如果y是互锁的,那么y上没有竞赛,因为它是原子可更新的,并且x上没有竞赛,因为a - > b - > d."
.在这个草案草案中不要使用两个互锁变量(如果我是对的,他的意思是InterlockedExchange仅用于y).
这将在没有互斥量的情况下完成.我只是想知道它是否是线程安全的,即程序不会崩溃或类似的东西.我并不真正关心变量在读取时可能处于错误状态,因为后果不是致命的(只有在没有必要时才会产生小数据结构的副本)我正在使用Qt.
这是可能发生的上下文:从主线程,我将设置一个both,它是qthread的成员.在我将bool设置为true时或之后,qthread可以在使用此bool的函数中(这是主线程和qthread使用的函数,所有内容都已受到保护和同步,以便不具有两个线程同时运行的函数)
有点想起来,因为这个bool只用于主线程,不管怎样我会检查哪个线程在函数中,哪个应该解决,但我仍然很好奇.
我有一个类型的共享变量double.这个变量将由两个线程访问.一个线程将只编写变量,而另一个线程将只读取变量.
我还能在这里得到比赛条件吗?如果是的话,C++中是否有一种"简单"的方式来实现原子访问?如果有更多的读取而不是写入,我如何有效地实现它?我需要将变量标记为volatile?
编辑:好的"阅读器"线程定期对批量数据工作,新值的传播不是时间敏感的.我没有实现我没有好的测试方法的复杂联锁,而是可以声明写入线程将写入的另一个临时变量.然后,当读者完成一个批处理时,它可以将临时值原子传播到实际变量.这会没有竞争条件吗?
如果在一个线程上我将写入原始类型的变量(例如)int,而另一个线程正在读取该变量,那么是否有可能像更复杂的数据类型一样读取部分修改的数据?
如果是的话,那么我唯一的解决方法是要么atomic或者mutex要么有没有一种性能开销较小的解决方案?
c++ concurrency multithreading race-condition memory-corruption