关于volatile与多线程共享变量的思考

众所周知,mutex保证了读写的可控性,volatile则保证读写的实时性,这种实时性至少包括两个方面:

1.将中断、其他线程、其他设备等的行为纳入考虑

2.阻止编译器优化

 

在多线程共享数据时(我指的是简单地使用变量而非用到某些库的功能),

即使用了mutex,我们并没有保证阻止编译器的优化,

除非我们对自己的程序流程以及编译器极有把握,

不然不能排除极少数被优化掉的情况,举个例子:

void fun()
{
    // 因为优化、内联等原因,不能保证函数对外的实时性
    // "通俗"地讲,函数内的某些变量取值可能来自寄存器

    a = b;
}

当然,我可以不开优化。——但是有时候我就是想要优化。

那能不能局部禁止优化?——听说没有。

那就老老实实加上volatile吧?——可以,但是比较烦,举些例子:

struct type { int a, b, c; };

// 又长又臭
volatile type a, b, *volatile c;

// 错误
a = b;

// 我靠。。。
a.a = b.a;
a.b = b.b;
a.c = b.c;

怎么办?用也不是,不用也不是。。。

于是冥思苦想,想到个法子:

void fun()
{
    if(volatile char a = 0) return;
    // "通俗"地讲,函数内的所有第一次取值都将来自内存

    a = b;
}

VS2019亲测有效,并且我通俗地称之为:

#define clear_register if(volatile char a = 0) return;

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值