我不能在这里使用C ++ 11原子
我怀疑我使用InterlockedCompareExchange()
来“原子地”读取变量。
我问了一个关于这个here的问题,但我在那里做的是不同的。 “交换”和“竞争者”参数(第2和第3)是“硬编码”值,即不从变量读取。
请考虑一下:
// Copy the connect time
DWORD dwConnectTime = InterlockedCompareExchange(&msgInfo.m_dwConnectTime,
msgInfo.m_dwConnectTime,
msgInfo.m_dwConnectTime);
如果msgInfo.m_dwConnectTime
的当前值为msgInfo.m_dwConnectTime
,则用于将msgInfo.m_dwConnectTime
的值与msgInfo.m_dwConnectTime
的当前值进行交换。然后返回msgInfo.m_dwConnectTime
的先前值,,这是我依赖“复制”值。
虽然第二个和第三个参数本身的msgInfo.m_dwConnectTime
读取不保证是原子的,但我刚才明白了。因此,这段代码是否不正确,因此我需要使用锁定原语来复制msgInfo.m_dwConnectTime
?
答案 0 :(得分:3)
根据评论和您之前问题的链接,这个问题的动机是您希望避免撕裂。读取和写入对齐数据是原子的。您试图防止撕裂,但在数据对齐时无法撕裂。可以合理地假设您的数据是对齐的,因为这是InterlockedCompareExchange
以及所有InterlockedXXX
函数的要求。
因此,你提出的问题是一个不合理的问题。它基于错误的前提,即对齐数据可能会发生撕裂。
因此,您无需拨打InterlockedCompareExchange
或任何其他InterlockedXXX
功能以避免撕裂,因为只有在数据未对齐时才能进行撕裂。