在 Linux 中,C++ 提供了一些多线程同步方法,可以用于确保多个线程之间的协调和互斥访问共享资源。以下是几种常见的多线程同步方法:
-
std::mutex 和 std::lock_guard:
C++ 11 引入的 std::mutex 是互斥量类,用于提供互斥访问共享资源的能力。可以使用 std::lock_guard 来自动管理互斥量的加锁和解锁,确保在退出作用域时自动解锁。例如:std::mutex mtx; // 线程1 { std::lock_guard<std::mutex> lock(mtx); // 自动加锁 // 访问共享资源 } // 自动解锁 // 线程2 { std::lock_guard<std::mutex> lock(mtx); // 自动加锁 // 访问共享资源 } // 自动解锁 -
std::condition_variable:
std::condition_variable 是条件变量类,可以用于线程间的等待和通知机制。一个线程可以等待某一条件的满足,而另一线程可以在合适的时机对条件变量进行通知。例如:std::mutex mtx; std::condition_variable cv; bool ready = false; // 线程1 { std::unique_lock<std::mutex> lock(mtx); // 使用 unique_lock 实现可手动加锁和解锁 while (!ready) { cv.wait(lock); // 等待条件满足 } // 访问共享资源 } // 线程2 { std::lock_guard<std::mutex> lock(mtx); // 使用 lock_guard 自动加锁和解锁 ready = true; cv.notify_one(); // 发送条件满足的通知给等待的线程 } -
std::atomic:
std::atomic 提供了原子操作,用于确保共享变量的原子性操作,避免线程间竞争。std::atomic 可以让多个线程对同一个变量进行原子操作。例如:std::atomic<int> counter(0); // 原子整型变量 // 线程1 counter.fetch_add(1); // 原子加1操作 // 线程2 counter.fetch_sub(1); // 原子减1操作 -
std::mutex 和 std::condition_variable 的组合使用:
std::mutex 和 std::condition_variable 可以结合使用,实现更复杂的线程同步需求,如互斥队列、生产者-消费者模型等。
以上是一些常见的多线程同步方法,不同的方法适用于不同的场景和需求。在使用这些方法时,需要考虑线程安全性、性能、死锁避免等问题,以确保多线程程序的正确性和效率。