C++11 引入了多种线程同步机制,包括互斥量(mutex)、条件变量(condition_variable)、原子操作(atomic)等。
- 互斥量(mutex):用于保护共享资源,防止多个线程同时访问。使用 std::mutex 类实现。
#include <iostream> #include <thread> #include <mutex> std::mutex mtx; void print_block(int n, char c) { mtx.lock(); for (int i = 0; i < n; ++i) { std::cout << c; } std::cout << ""<<std::endl; mtx.unlock(); } int main() { std::thread th1(print_block, 50, '*'); std::thread th2(print_block, 50, '$'); th1.join(); th2.join(); return 0; }
运行结果:
-
条件变量(condition_variable):用于线程间的同步,一个线程等待某个条件满足时,另一个线程通知它继续执行。使用 std::condition_variable 类实现。
#include <iostream> #include <thread> #include <mutex> #include <condition_variable> std::mutex mtx; std::condition_variable cv; bool ready = false; void print_id(int id) { std::unique_lock<std::mutex> lck(mtx); while (!ready) { cv.wait(lck); } std::cout << "thread " << id << ""<<std::endl; } void go() { std::unique_lock<std::mutex> lck(mtx); ready = true; cv.notify_all(); } int main() { //创建10个线程并且均处于等待状态 std::thread threads[10]; for (int i = 0; i < 10; ++i) { threads[i] = std::thread(print_id, i); } //主线程通知子线程去执行 std::cout << "10 threads ready to race..."<<std::endl; go(); for (auto& th : threads) { th.join(); } return 0; }
运行结果:
-
原子操作(atomic):用于实现无锁的线程同步,避免使用互斥量带来的性能损失。使用 std::atomic 类模板实现。
#include <iostream> #include <thread> #include <atomic> std::atomic<int> counter(0); void increase() { for (int i = 0; i < 100000; ++i) { ++counter; } } int main() { std::thread th1(increase); std::thread th2(increase); th1.join(); th2.join(); std::cout << "counter: " << counter << ""; return 0; }
运行结果: