gpt4 book ai didi

c - 不正确地使用 InterlockedCompareExchange 以原子方式复制值?

转载 作者:太空宇宙 更新时间:2023-11-04 06:51:50 24 4
gpt4 key购买 nike

我不能在这里使用 C++11 原子

我对使用 InterlockedCompareExchange() 来“原子地”读取变量有疑问。

我问了一个关于这个的问题here ,但我在那里做的是不同的。 “exchange”和“comperand”参数(第二个和第三个)是“硬编码”值,即不是从变量中读取的。

请考虑一下:

    // 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 的当前值code> 是 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com