condition_variable和mutex,并举个例子,告诉我如何使用他们
时间: 2024-03-19 11:41:42 浏览: 107
condition_variable源码以及详细分析.docx
在++中,通常使用mutex和condition_variable来实现多线程之间的同步和协调。
下面是一个简单的例子,展示了如何使用mutex和condition_variable来实现两个线程之间的同步:
```cpp
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void worker_thread() {
// 等待主线程通知
std::unique_lock<std::mutex> lck(mtx);
cv.wait(lck, []{ return ready; });
// 收到通知后执行任务
std::cout << "Worker thread is running." << std::endl;
}
int main() {
// 创建工作线程
std::thread worker(worker_thread);
// 执行一些任务
std::cout << "Main thread is running." << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
// 通知工作线程可以执行任务了
{
std::lock_guard<std::mutex> lck(mtx);
ready = true;
}
cv.notify_one();
// 等待工作线程执行完毕
worker.join();
return 0;
}
```
在这个例子中,我们创建了一个工作线程和一个主线程。工作线程等待主线程通知,只有当主线程通知后,工作线程才会开始执行任务。为了实现这个逻辑,我们使用了mutex和condition_variable。主线程在通知工作线程可以执行任务之前,先获取了mutex的控制权,然后设置`ready`变量为`true`,并使用`cv.notify_one()`来通知工作线程。工作线程在等待通知时,使用`cv.wait()`来阻塞自己并释放mutex的控制权。只有当主线程通知后,它才会收到通知并开始执行任务。
这个例子中,mutex和condition_variable的使用方式是:
- 使用`std::mutex`来创建一个互斥量,用于保护共享资源。在主线程中,我们使用`std::lock_guard`来获取mutex的控制权,并在代码块结束时自动释放mutex的控制权。
- 使用`std::condition_variable`来创建一个条件变量,用于在线程之间传递信号和等待通知。在工作线程中,我们使用`std::unique_lock`来获取mutex的控制权,并使用`cv.wait()`来阻塞自己并释放mutex的控制权。只有当主线程通知后,它才会收到通知并继续执行。在主线程中,我们使用`cv.notify_one()`来通知工作线程可以继续执行了。
阅读全文