错误地使用InterlockedCompareExchange以原子方式复制值?

时间:2018-05-01 14:20:33

标签: c multithreading winapi

我不能在这里使用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

1 个答案:

答案 0 :(得分:3)

根据评论和您之前问题的链接,这个问题的动机是您希望避免撕裂。读取和写入对齐数据是原子的。您试图防止撕裂,但在数据对齐时无法撕裂。可以合理地假设您的数据是对齐的,因为这是InterlockedCompareExchange以及所有InterlockedXXX函数的要求。

因此,你提出的问题是一个不合理的问题。它基于错误的前提,即对齐数据可能会发生撕裂。

因此,您无需拨打InterlockedCompareExchange或任何其他InterlockedXXX功能以避免撕裂,因为只有在数据未对齐时才能进行撕裂。