zoukankan      html  css  js  c++  java
  • c/c++多线程编程中最好不要加volatile

    来自https://www.zhihu.com/question/31459750

    答主解释说:不能指望volatile能解决多线程竞争问题,除非所用的环境系统不可靠才会为了保险加上volatile,

    或者从极限效率考虑来实现很底层的接口,这要求编写者对逻辑走向很清楚,不然会出错。

    c++11标准明确指出解决多线程的数据竞争问题应该使用原子操作或互斥锁。

    c和c++中的volatile并不是用来解决多线竞争问题的,而是用来修饰一些程序不可控因素导致变化的变量,比如访问底层硬件设备的变量,来提醒编译器不要对该变量的访问擅自进行优化。

    多线程场景下可以参考《Programming with POSIX threads》的作者Dave Butenhof对
    Why don't I need to declare shared variables VOLATILE?
    这个问题的解释:
    comp.programming.threads FAQ

    简单的来说,对访问共享数据的代码块加锁,已经足够保证数据访问的同步性,再加volatile完全是多此一举。
    如果光对共享变量使用volatile修饰而在可能存在竞争的操作中不加锁或使用原子操作对解决多线程竞争没有任何卵用,因为volatile并不能保证操作的原子性,在读取、写入变量的过程中仍然可能被其他线程打断导致意外结果发生。
    ==========
  • 相关阅读:
    SignalR
    log4net
    nginx
    mongodb
    uni-app监听软键盘是否弹起,ios不支持
    js插件开发兼容commonJS、AMD、CDM的UMD写法
    uni-app 实现后端返回的图片文件流转base64
    input输入框限制只能输入数字和一个小数点
    Uni-app工程转vue-cli工程步骤
    H5 移动端开发注意事项
  • 原文地址:https://www.cnblogs.com/li-daphne/p/5583912.html
Copyright © 2011-2022 走看看