数据竞争
如果多个线程同时访问同一个变量, 可能对引起数据竞争:
- 如果这个访问是读操作,对这个数据没影响。
- 如果这个访问是写操作,很有可能引起数据竞争。
试想一下,如果线程A想要对主线程中的变量num进行加一操作,刚读取变量A的值后,时间片用完,转入阻塞状态,此时线程B主线程中的变量num进行加一操作。此后线程A再次执行,但还是用之前读取的num值进行操作,而没有感知到线程B已经对num变量进行过修改。
互斥对象
mutex对象是指定代码的访问。
头文件
#include<mutex>
code
分别用两个线程t1,t2对同一个变量进行加10000的操作。如果不加互斥变量进行加锁操作,最后a的值是14452。加锁之后,值才是20000。
#include<iostream>
#include<thread>
#include<mutex>
static int a = 0;
std::mutex mu;
void Add1000() {
for (int i=0; i<10000; i++) {
mu.lock();
a++;
mu.unlock();
}
}
int main() {
std::thread t1(Add1000);
std::thread t2(Add1000);
t1.join();
t2.join();
std::cout << "aft