c - 错误地使用 InterlockedCompareExchange 以原子方式复制值?
问题描述
我不能在这里使用 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 - 如何获取结构形式的二进制文件?
- r - R从数据框列创建数据框的方法
- javascript - 将 Promise 的值存储到变量中,以便稍后与状态一起使用。(反应原生)
- java - JAR 在 Lucee 上找不到 BouncyCastleProvider
- web-services - 在 WCF 客户端中应该绑定什么以使用 OAuth 身份验证调用 SOAP Web 服务
- scala - Spark Scala:无法执行用户定义的函数原因:SparkException:必须在您的配置中设置主 URL
- python - YouTube-DL 的 Python GTK GUI 在窗口中显示进度
- jqgrid - jqgrid 自定义过滤器值应设置为现有工具栏
- c++ - 如何根据字符字母计算字符串中出现的次数?
- python - scipy.optimize.fmin_cg 函数需要两个可调用函数 f 和 fprime,如何从返回两个值的函数中提取两个函数?