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

10-12 04:56