显然不是。
++i和i++的区别在于一个是先自增再赋值,一个是先赋值再自增。(大家应该都知道,不详细举例子了)
++i和i++的过程可以分为3步, 这3步并不是一个原子操作, 一个线程在执行①、②、③步的过程中,是可能被其他线程打断的:
- ①从内存读入临时i值,假设为temp,放在寄存器
- ②在寄存器中对temp值+1
- ③将寄存器中temp+1的值写回内存赋给i
举个例子,假设现在i是一个全局变量,有2个线程要各自同时对i自增1000w次。代码如下:
#include <iostream>
#include <vector>
#include <thread>
using namespace std;
int i = 0; // 全局变量
void fun() {
for (int j = 0; j < 10000000; ++j) {
++i;
}
}
int main() {
vector<thread> vec;
for (int j = 0; j < 2