c++11使用atomic多线程同步3种方法

it2023-07-10  67

// 使用CAS实现多线程无锁访问共享变量,达到线程同步 # include <iostream> # include <thread> # include <mutex> # include <atomic> using namespace std; std::atomic<int> var(0); void add() { int expect = var; while (!atomic_compare_exchange_weak(&var, &expect, var + 1)); } int main(int argc, char *argv[]) { int count = 2000; std::thread threads[count]; for (int i = 0; i < count; ++i) threads[i] = std::thread(add); for (int i = 0; i < count; ++i) threads[i].join(); cout << var << endl; // var 为 2000,无误!! return 0; } // 使用原子数据类型的原子方法操作,达到同步线程 # include <iostream> # include <thread> # include <mutex> # include <atomic> using namespace std; std::atomic<int> var(0); void add() { var.fetch_add(1); // cout << std::boolalpha ; // cout << "is_lock_free:" << var.is_lock_free() << endl; // true } int main(int argc, char *argv[]) { int count = 2000; std::thread threads[count]; // default-constructed threads for (int i = 0; i < count; ++i) threads[i] = std::thread(add); for (int i = 0; i < count; ++i) threads[i].join(); cout << var << endl; return 0; } // 使用RAII的mutex,同步线程 # include <iostream> # include <thread> # include <mutex> # include <atomic> using namespace std; std::mutex mtx; void add(int *var) { std::lock_guard<std::mutex> l(mtx); (*var)++; } int main(int argc, char *argv[]) { int count = 2000; std::thread threads[count]; // default-constructed threads int *var = new int [1]; for (int i = 0; i < count; ++i) threads[i] = std::thread(add, var); for (int i = 0; i < count; ++i) threads[i].join(); cout << *var << endl; return 0; }
最新回复(0)