【C++/Linux复习知识点】条件竞争

条件竞争是由于多个线程竞争操作同一个变量引起的结果不可预测性,例如两个线程同时对一个共享变量读,一个写完另一个写,后者的结果覆盖前者。
例如:

#include 
#include "util.h"
#include "thread"

int count = 0;

void add() {
    for (int i = 0; i < 10000; i++) {
        count += 1;
    }
}

int main() {
    std::thread t1(add);
    std::thread t2(add);
    t1.join();
    t2.join();
    std::cout << count << std::endl;
    return 0;
}

// 结果不一定是20000

解决方法:
需要保证在任何时候只有一个线程操作共享变量。

因此可以使用:互斥锁(std::mutex),递归互斥锁(std::recursive_mutex),读写锁(std::shared_mutex)等实现线程同步。

或者也可以使用原子操作实现,这种原语操作在底层硬件层面上确保了同一时刻只有一个线程可以访问共享变量。

std::atomic<int> count(0);

void add() {
    for (int i = 0; i < 10000; i++) {
        count += 1;
    }
}

你可能感兴趣的:(C++,c++)