为了账号安全,请及时绑定邮箱和手机立即绑定

何时使用易失性与多线程?

何时使用易失性与多线程?

C++
白衣非少年 2019-06-28 17:02:41
如果有两个线程访问全局变量,那么许多教程都表示,使变量易失性,以防止编译器将变量缓存在寄存器中,从而无法正确更新变量。但是,两个线程都访问共享变量是需要通过互斥保护的,不是吗?但是在这种情况下,在线程锁定和释放互斥锁之间,代码处于一个关键部分,其中只有一个线程可以访问变量,在这种情况下,变量不需要是易失性的?那么,在多线程程序中易失性的用途/用途是什么呢?何时使用易失性与多线程?
查看完整描述

3 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

易失性有时是有用的,原因如下:

/* global */ bool flag = false;while (!flag) {}

GCC优化如下:

if (!flag) { while (true) {} }

如果标志是由另一个线程写入的,这显然是不正确的。注意,如果没有这种优化,同步机制可能会工作(取决于其他代码,可能需要一些内存屏障)-在1个生产者-1个消费者场景中不需要互斥。

否则,易失性关键字太奇怪,无法使用-它不提供任何内存排序保证WRT的易失性和非易失性访问,也不提供任何原子操作-也就是说,除了禁用寄存器缓存之外,您没有从编译器那里得到任何使用易失性关键字的帮助。


查看完整回答
反对 回复 2019-06-28
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

你需要变化无常也可能是锁定。

易失性告诉优化器值可以异步更改,因此

volatile bool flag = false;while (!flag) {
    /*do something*/}

每次循环时都会读取标志。

如果您关闭优化或使每个变量不稳定,程序的行为将相同,但速度较慢。易失性只意味着‘我知道你可能只读了它,知道它说什么,但如果我说读它,那就读它。

锁定是程序的一部分。因此,顺便说一句,如果您正在实现信号量,那么除其他外,它们必须是不稳定的。(不要尝试它,它很难,可能需要一个小的汇编程序或新的原子的东西,而且它已经做了。)


查看完整回答
反对 回复 2019-06-28
  • 3 回答
  • 0 关注
  • 357 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信