如何解决c ++:原子变量的值在保存到局部变量时无效
我在某些Obj-C文件中定义了原子变量 current :
std::atomic<long long> current;
启动之后:
current=4;
此后,可以通过线程数访问该变量。 一些线程这样修改变量:
current=(current.fetch_add(1))%4;
其他线程以不同方式修改了变量:
current.fetch_add(1);
if(current>=4){
current=0;
}
最后执行下一行:
long long cs=current;
这时发生了一件奇怪的事情:在调试器中, cs 为4,而 current 具有不同的值,通常为1。 我的期望是 cs 的最新值应为 current ,并且永远不能大于3。 我检查了 current 的所有其他实例;它们并不多,并且在任何地方都可以正确使用。 我想念什么?
解决方法
原子值不是同步原语。可能的执行流程之一:
current.fetch_add(1); // T1
long long cs=current; // T2
if(current>=4){ // T1
current=0;
}
和
auto tmp = current.fetch_add(1); // T1
long long cs=current; // T2
current=tmp%4; // T1
解决方案是使用带有比较交换的互斥锁或自旋锁。
,这种情况很可能在多线程环境中发生。假设只有2个线程,我在这里称为THREAD-2的主线程和工作线程THREAD-1。让我们从当前值为3的电流开始,现在将其递增THREAD-1,而THREAD-2正在更新变量cs。
THREAD-1: current.fetch_add(1);
THREAD-2: cs = current;
THREAD-1: if(current>=4){ current=0; }
如您所见,当电流为4时,cs获得其值。
此外,这也不是Objective-C的问题,这仅仅是C ++。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。