Q:多线程读写同一个变量时,如何保护?
-
使用线程锁,但是耗时长,不推荐使用;
-
c++11中新增原子操作特性,能够对变量加以保护,推荐用此方法。
例:
#include <iostream>
#include <thread>
#include<atomic>
using namespace std;
atomic<int> sum(0); //int sum = 0;
void t1()
{
for(int i =0;i<1000000;i++)
{
sum++;
}
}
void t2()
{
for(int j =0;j<1000000;j++)
{
sum++;
}
}
int main()
{
thread th1(t1);
thread th2(t2);
th1.join();
th2.join();
cout<<"sum = "<<sum<<endl;
cout<<"end"<<endl;
return 0;
}
-
在不使用原子操作时,结果是随机的,因为两个线程可能同时在sum++; 使得sum最终<2000000;
-
在使用原子操作后,结果一定是2000000,因为两个线程没有同时对sum进行操作;
-
时间统计如下: