cpp condition_variable notify_all notify_one使用经典实例,逐行代码讲解
时间: 2024-06-09 17:10:51 浏览: 97
condition_variable源码以及详细分析.docx
好的,下面我来给你讲解一下 `condition_variable` 的经典使用实例,包括 `notify_all` 和 `notify_one` 的使用。
首先,我们需要定义一个 `std::mutex` 和一个 `std::condition_variable`,用来实现线程之间的同步和通信。
```cpp
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
```
在这个例子中,我们定义了一个 `bool` 类型的变量 `ready`,用来表示线程是否准备好了。同时,我们定义了一个互斥锁 `mtx` 和一个条件变量 `cv`,用来保护 `ready` 变量,防止多个线程同时访问和修改。
接下来,我们定义两个线程,一个线程用来等待 `ready` 变量变为 `true`,另一个线程用来修改 `ready` 变量为 `true`。
```cpp
void worker_thread()
{
// 等待主线程通知
std::unique_lock<std::mutex> lck(mtx);
cv.wait(lck, []{ return ready; });
// 等待结束,do something
std::cout << "Worker thread is processing data...\n";
}
int main()
{
// 创建工作线程
std::thread worker(worker_thread);
// 等待一段时间
std::this_thread::sleep_for(std::chrono::seconds(2));
// 修改 ready 变量为 true
{
std::lock_guard<std::mutex> lck(mtx);
ready = true;
}
// 通知工作线程
cv.notify_one();
// 等待工作线程结束
worker.join();
return 0;
}
```
在 `main()` 函数中,我们创建了一个工作线程 `worker`,并且在主线程中等待 2 秒钟,模拟工作线程需要等待一段时间才能开始处理数据。
在等待结束后,我们修改了 `ready` 变量为 `true`,并且调用了 `cv.notify_one()` 来通知等待的工作线程可以开始处理数据了。
在工作线程中,我们首先使用 `std::unique_lock<std::mutex>` 对互斥锁进行了锁定,并且调用了 `cv.wait(lck, []{ return ready; })` 来等待条件变量的通知。
`cv.wait()` 函数的作用是使当前线程等待条件变量的通知,当条件变量被通知后,线程会被唤醒,继续执行后面的代码。 `cv.wait()` 函数会自动释放互斥锁,并且在等待期间阻塞当前线程。
在等待期间,工作线程会一直等待,直到主线程调用 `cv.notify_one()` 来通知工作线程可以开始处理数据了。
当工作线程被唤醒后,它会继续执行后面的代码,并且输出一条信息,表示正在处理数据。
这就是 `condition_variable` 的经典使用实例,通过 `notify_all` 和 `notify_one` 函数来实现线程之间的同步和通信。
阅读全文