多线程访问std::atomic:能否同时操作?操作粒度有多细?
关于std::atomic多线程读写的问题解答
首先看你的代码示例:
std::atomic<int> counter = 0; void fn() { while(true) { ++counter; if(counter > 1000) break; } }
针对你的问题解答如下:
- 线程2是否需要等待线程1完成递增后才能读取counter?
++counter是一个原子写操作,if (counter > 1000)里的读取是原子读操作。原子操作的核心特性是“不可分割性”——硬件会保证写操作要么完全执行完毕,要么完全没执行,不存在中间状态。线程2不需要主动等待线程1的递增完成,但这两个原子操作不会同时执行:线程2的读操作要么读到线程1递增前的旧值,要么读到递增后的新值,绝不会读到半修改的中间值。 - 两个线程同时读取counter时,能否同时进行?
可以同时读取。原子读操作在硬件层面是支持并发的,多个线程的读操作不需要互相锁定或等待。它们可以同时获取counter的当前值,不会出现数据竞争或读取错误。
内容的提问来源于stack exchange,提问作者vova
相关产品推荐
相关产品推荐

