C++11 学习笔记(10) std::atomic i; ++i 前缀自增运算的原子性分析

目前项目中使用到了多线程, 我选择 C++11 std::thread 库实现,
模仿开源的流媒体服务器 crtmpserver 里的 protocol类,
每生成一个实例类, 都会有全局的唯一id.
在整个函数声明周期里, 定义:
static u_int32_t idGlobalGenerator; // 初始化0
即当一个类生成时, 该实例类的私有成员 u_int32_t id_;
在构造函数里初始化 id_ = idGlobalGenerator++;
由于我的开发场景是多线程, 因此 idGlobalGenerator
被声明为:

执行 ++idGlobalGenerator; 操作, 根据文档和语义它是原子性的. 而在这里产生的疑惑是:

u_int32_t id = ++idGlobalGenerator;

该执行是否是原子性, 保证多线程环境下, 赋值的 id都是唯一的值.
于是我在 stackoverflow上直接提了问题(当时没有亲自验证): 链接

Continue reading

C++11 学习笔记(9) 线程与信号 改进2 atomic

本文基于 C++11 学习笔记(7) 线程与信号 添加上了 atomic 支持做的改进:

改进的参考资源:
C++11 atomic 与 mutex 性能比较
stackoverflow 讨论C++11 atomic 与 mutex 速度
介绍 atomic 并发的博客
C++11 atomic memory model
C++11 修复了双重检查锁定问题

引用 wilburding作者的 C++11 atomic memory model文章(http://wilburding.github.io/blog/2013/04/07/c-plus-plus-11-atomic-and-memory-model/) :

C++11 atomic 与 mutex 性能比较 的博客 也提到 使用 std::mutex
直接调用lock unlock 的性能开销比 lock_guard 或者 atomic大的多.

因此针对系列笔记 (7)的代码作了优化:

Continue reading