我不能在这里使用C++ 11原子
我对使用InterlockedCompareExchange()
来“原子地”读取变量有疑问。
我问了一个关于这个的问题,但是我在那里做的是不同的。“exchange”和“comperand”参数(第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
? 最佳答案
根据你之前的问题的评论和链接,这个问题的动机是你想要避免撕裂。读取和写入对齐的数据是原子的。您试图防止撕裂,但当数据对齐时,撕裂是不可能的。假设您的数据是对齐的是合理的,因为这是InterlockedCompareExchange
和所有InterlockedXXX
函数的要求。
因此,你所问的问题有些不合逻辑。这是基于一个错误的前提,即数据对齐时可能发生撕裂。
因此,不需要调用InterlockedCompareExchange
或任何其他InterlockedXXX
函数来避免撕裂,因为只有在数据未对齐时才可能撕裂。
关于c - 错误使用InterlockedCompareExchange来自动复制值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50118185/