Bootstrap

++i和i++是线程安全的吗?

       显然不是。

       

       ++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
;