std::mutex mutex_; std::condition_variable cv_;
时间: 2024-08-13 19:05:44 浏览: 66
`std::mutex`和`std::condition_variable`是C++11标准库中的互斥量和条件变量,它们在并发编程中扮演着关键角色。
1. **std::mutex** (互斥锁):这是一个用于同步线程访问临界区(代码块)的工具,防止多个线程同时执行同一部分代码,从而避免数据竞争。当一个线程获得了互斥锁后,其他线程将被阻塞直到锁被释放。这是保证线程安全的重要机制之一。
2. **std::condition_variable** (条件变量):这个类用于线程之间的同步,允许一个线程等待某个条件发生,而另一个线程则可以修改这个条件并唤醒等待的线程。它结合了互斥锁使用,当一个线程持有互斥锁并在满足某个条件时调用`wait()`,则会释放锁,并进入等待状态。其他线程如果持有相同的锁并检测到条件满足,可以调用`notify_one()`或`notify_all()`来唤醒等待的线程。
在使用这些概念时,通常这样配合:
```cpp
std::mutex mtx; // 创建互斥锁
std::condition_variable cv; // 创建条件变量
// 在需要保护的代码块前获取互斥锁
std::lock_guard<std::mutex> lock(mtx);
// 在满足特定条件后,释放锁并等待
cv.wait(lock, []{ return some_condition; });
// 或者,在满足条件后唤醒等待的线程
cv.notify_one();
```
相关问题
std::condition_variable配合std::unique_lock
`std::condition_variable`和`std::unique_lock`是C++11中提供的一种同步原语,它们通常一起用于实现条件变量,即当一个线程等待某个条件满足时进入睡眠状态,而其他线程通过改变条件可以唤醒它。
`std::condition_variable`负责维护一个“等待队列”,当线程调用`wait`或`wait_for`时,它会把自己放入这个队列,并进入睡眠状态。只有持有`std::unique_lock`的对象才能解锁并修改`condition_variable`的状态,从而唤醒等待的线程。
`std::unique_lock`则是一种独占锁,它既可以锁定也可以解锁某个互斥量(mutex)。当你需要等待某个条件时,你可以先锁定互斥量,然后创建一个`std::unique_lock`实例,并将其传递给`condition_variable`的`wait`方法。当条件满足时,释放互斥量(即调用`unlock`),这将唤醒等待的线程,然后继续执行。
示例代码片段:
```cpp
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
// 主线程设置条件
{
std::lock_guard<std::mutex> lck(mtx);
if (/* 条件满足 */) {
ready = true;
cv.notify_one(); // 唤醒等待者
}
}
// 等待线程
std::unique_lock<std::mutex> ulock(mtx);
cv.wait(ulock, [] { return ready; }); // 等待直到ready变为true
// 现在条件已满足,可以执行后续操作
```
std::condition_variable::notify_one()
std::condition_variable::notify_one() 是一个 C++ 标准库中的函数,用于唤醒等待中的单个线程。当某个线程在等待条件变量时调用 notify_one(),它会唤醒一个等待中的线程,使其继续执行。
这个函数通常与 std::unique_lock 一起使用,如下所示:
```cpp
#include <iostream>
#include <thread>
#include <condition_variable>
std::condition_variable cv;
std::mutex mtx;
bool ready = false;
void worker_thread()
{
std::unique_lock<std::mutex> lock(mtx);
while (!ready)
{
cv.wait(lock);
}
// 唤醒后继续执行其他操作
std::cout << "Worker thread is awake!" << std::endl;
}
int main()
{
std::thread worker(worker_thread);
// 做一些其他工作...
// 通知等待中的线程
{
std::lock_guard<std::mutex> lock(mtx);
ready = true;
}
cv.notify_one();
worker.join();
return 0;
}
```
在上面的例子中,worker_thread() 函数通过调用 cv.wait(lock) 进入等待状态。当主线程准备好后,它会调用 cv.notify_one() 来唤醒一个等待中的线程(即 worker_thread()),从而使其继续执行。
请注意,std::condition_variable 需要与 std::mutex 一起使用,以确保在等待和通知期间的线程安全。
阅读全文