c++ Multithreading programming 学习(3)

继上一篇介绍完pthead,本来想接着学习c++的thread库,但又有点犯懒,感觉自己封装一下pthread就好,因为我的业余开发环境是linux,而且c++版本还停留在c++11(很多人诟病c++11 的thread库),所以只要封装出thread, mutex, condition_variable和lock_guard (RAII. acquire resource at initialization and release at destruction) 那应该就够我自己用了。但是考虑到公司早已转到c++17, 我还是学习一下。不过在这一节,我先附上一些对我以前一些疑问的解答,在下一节再接着写 <thread>库。

作者:Gomo Psivarh
链接:https://www.zhihu.com/question/31459750/answer/52069135
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
C/C++多线程编程中不要使用volatile。(注:这里的意思指的是指望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并不能保证操作的原子性,在读取、写入变量的过程中仍然可能被其他线程打断导致意外结果发生。