c++ 一个小问题

[复制链接]
查看11 | 回复6 | 2021-1-27 06:45:35 | 显示全部楼层 |阅读模式
有个变量intA=0
然后有一个线程,对A做了原子自增操作,比如:addinatomic(&A,1)当然这个函数名字是乱写的,是这个意思就行
与此同时,另外一个从A做原子操作之前就开始不停的读A的值
问题:这种方式安全吗?那个读线程可能读到错误的数据吗?,比如A原子自增后,读线程可能读到不是1的值吗?(32位平台,不考虑32位64位的问题)
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:45:35 | 显示全部楼层
你都说是原子操作了,当然没问题了
所谓原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何contextswitch(切换到另一个线程)
回复

使用道具 举报

千问 | 2021-1-27 06:45:35 | 显示全部楼层
推荐本书吧,你这可不是小问题...
C++ConcurrencyinAction
files.cnblogs.com/files/ittinybird/CplusplusConcurrencyInAction.pdf

回复

使用道具 举报

千问 | 2021-1-27 06:45:35 | 显示全部楼层
引用1楼paschen的回复:你都说是原子操作了,当然没问题了
所谓原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何contextswitch(切换到另一个线程)

多谢您的回答,还有一个疑问:
您讲的情况在单线程下可能不会切换线程,若是系统是多核的,同时时刻有多个线程在读这个变量呢?请您赐教


回复

使用道具 举报

千问 | 2021-1-27 06:45:35 | 显示全部楼层
引用3楼IAMDIAOSI的回复:Quote: 引用1楼paschen的回复:
你都说是原子操作了,当然没问题了
所谓原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何contextswitch(切换到另一个线程)

多谢您的回答,还有一个疑问:
您讲的情况在单线程下可能不会切换线程,若是系统是多核的,同时时刻有多个线程在读这个变量呢?请您赐教


硬件上会保证,具体看http://www.baike.com/wiki/%E5%8E%9F%E5%AD%90%E6%93%8D%E4%BD%9C
回复

使用道具 举报

千问 | 2021-1-27 06:45:35 | 显示全部楼层
有可能一直读到0,也有可能读到0然后读到1;至于0是不是错误的值,业务说了算。

回复

使用道具 举报

千问 | 2021-1-27 06:45:35 | 显示全部楼层
《Windows核心编程》
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行