c++ 封装一个条件变量的类
时间: 2023-08-14 19:04:38 浏览: 48
好的,下面是一个简单的 C++ 条件变量的封装类的示例代码:
```cpp
#include <mutex>
#include <condition_variable>
class ConditionVariable {
public:
ConditionVariable() = default;
// 等待条件变量被唤醒
void wait(std::unique_lock<std::mutex>& lock) {
cv_.wait(lock);
}
// 等待指定时间内条件变量被唤醒
template<typename Rep, typename Period>
std::cv_status wait_for(std::unique_lock<std::mutex>& lock,
const std::chrono::duration<Rep, Period>& rel_time) {
return cv_.wait_for(lock, rel_time);
}
// 唤醒一个等待的线程
void notify_one() {
cv_.notify_one();
}
// 唤醒所有等待的线程
void notify_all() {
cv_.notify_all();
}
private:
std::condition_variable cv_;
};
```
这个类使用 C++ 标准库中的 `std::condition_variable` 实现了条件变量的封装。它提供了等待条件变量被唤醒的接口 `wait`,等待指定时间内条件变量被唤醒的接口 `wait_for`,唤醒一个等待的线程的接口 `notify_one` 和唤醒所有等待的线程的接口 `notify_all`。
你可以像下面这样使用这个类:
```cpp
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
ConditionVariable cv;
std::mutex mtx;
bool ready = false;
void worker_thread()
{
// do some work
{
std::lock_guard<std::mutex> lk(mtx);
ready = true;
}
cv.notify_one(); // 通知等待的线程
}
int main()
{
std::thread worker(worker_thread);
// 等待条件变量
{
std::unique_lock<std::mutex> lk(mtx);
cv.wait(lk);
}
std::cout << "Worker thread finished\n";
worker.join();
return 0;
}
```
在这个示例中,我们使用了封装好的 `ConditionVariable` 类来实现条件变量的等待和唤醒。在 `worker_thread` 中,我们设置了条件变量 `ready` 并通知等待的线程。在 `main` 函数中,我们使用了 `ConditionVariable` 类的 `wait` 接口等待条件变量被唤醒。