- std::condition_variable
仅限于和std::mutex一起使用
只要符合互斥标准就能使用
下面使用std::condition_variable等待处理数据
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
class data_chunk {
public:
int val;
int other;
};
std::mutex mtx;
// 队列用于两个线程之间传递数据
std::queue<data_chunk> data_queue;
std::condition_variable data_cond;
// 线程B执行
void data_preparation_thread() {
while (more_data_to_prepare()) {
// 准备好数据 保护队列并压入数据
data_chunk data = prepare_data();
{
std::lock_guard<std::mutex> lk(mtx);
data_queue.push(data);
}
// 通知线程消费
data_cond.notify_one(); // 唤醒一个线程
}
}
// 线程A执行
void data_processing_thread() {
while (true) {
std::unique_lock<std::mutex> lk(mtx);
// lamda表达式指定需要等待成立的条件
// 若条件成立,wait返回,lk仍然被锁住
// 若条件不成立,A先解锁,再继续等待。结束等待之后,重新加锁。
data_cond.wait(lk,[]{
return !data_queue.empty();
});
data_chunk data = data_queue.front();
data_queue.pop();
lk.unlock(); // 拿到数据拷贝后释放
process(data);
if (is_last_chunk(data)) break;
}
}
int main() {
return 0;
}
No comments yet.