C++互斥量和条件变量如何使用
时间: 2024-05-15 17:13:10 浏览: 159
linux无亲缘关系间进程同步通信实现(互斥锁+条件变量+共享内存模式)
互斥量和条件变量是 C++ 中常用的同步机制,用于在多线程编程中控制共享资源的访问和线程间的通信。
互斥量(Mutex)用于保护共享资源,在访问共享资源之前需要获得互斥锁,访问完毕后需要释放互斥锁。具体使用方法如下:
```c++
#include <mutex>
std::mutex mtx; // 定义互斥锁
// 在访问共享资源之前加锁
mtx.lock();
// 访问共享资源
// 在访问共享资源之后释放锁
mtx.unlock();
```
条件变量(Condition variable)用于线程间的通信,一个线程可以通知另一个线程一些特定的事件已经发生。具体使用方法如下:
```c++
#include <condition_variable>
#include <mutex>
std::condition_variable cv; // 定义条件变量
std::mutex mtx; // 定义互斥锁
bool flag = false; // 条件变量依赖的标志变量
// 线程 1
std::unique_lock<std::mutex> lck(mtx); // 获得互斥锁
while(!flag) cv.wait(lck); // 等待条件变量
// 执行线程 1 的任务
// 线程 2
{
std::lock_guard<std::mutex> guard(mtx); // 获得互斥锁
// 执行线程 2 的任务
flag = true;
}
cv.notify_one(); // 通知条件变量
```
在上述代码中,线程 1 获得互斥锁后,检查标志变量 `flag` 是否满足条件,如果不满足,则进入等待状态,并释放互斥锁;线程 2 在获得互斥锁后,设置标志变量 `flag` 为真,并通知条件变量 `cv`,线程 1 得到通知后重新检查标志变量,如果满足条件,则执行线程 1 的任务。
需要注意的是,在使用条件变量时,必须获得互斥锁,以避免竞态条件的发生。另外,条件变量的使用通常需要和互斥锁一起使用,以确保线程安全。
阅读全文