std::condition_variable multi_frame_fusion_cond_;
std::condition_variable
是 C++ 标准库中的一个类,用于线程间的同步。它提供了一种机制,使得一个线程可以等待另一个线程满足某个条件后再继续执行。
在给定的代码中,multi_frame_fusion_cond_
是一个名为 multi_frame_fusion_cond_
的条件变量对象,它被用作线程间的同步机制。条件变量通常与互斥锁(std::mutex
)一起使用,以实现线程之间的协调和同步。
通过调用 std::condition_variable
对象的成员函数 wait()
,线程可以进入等待状态,并且会自动释放与之关联的互斥锁。在等待期间,线程会阻塞,直到满足某个条件后才会被唤醒。
其他线程可以通过调用条件变量对象的成员函数 notify_one()
或 notify_all()
来唤醒正在等待的线程。被唤醒的线程会重新尝试获取互斥锁,并继续执行后续逻辑。
多线程生产者与消费者代码
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
std::mutex mtx;
std::condition_variable cond;
std::queue<int> dataQueue;//共享资源
void producerFunction() {
for (int i = 0; i < 10; ++i) {
std::this_thread::sleep_for(std::chrono::milliseconds(500));
{
std::lock_guard<std::mutex> lock(mtx);
dataQueue.push(i);
std::cout << "Produced: " << i << std::endl;
}
//lock_guard 对象超出作用域时,会自动调用析构函数释放互斥锁
cond.notify_one();
}
}
//假设他时间片先到,先获得锁,然后执行等待条件变量,又会把锁释放掉,阻塞在这里
void consumerFunction() {
while (true) {
//消费者线程在一个无限循环中,不断尝试获取互斥锁 mtx
std::unique_lock<std::mutex> lock(mtx);
//一旦获取到互斥锁,消费者线程调用cond.wait来等待条件变量的通知,并且在等待过程中会自动释放互斥锁
//当条件变量满足(即队列不为空),消费者线程会被唤醒,并且重新获取互斥锁
cond.wait(lock, [] { return !dataQueue.empty(); });
int data = dataQueue.front();
dataQueue.pop();
std::cout << "Consumed: " << data << std::endl;
lock.unlock();//处理完成后要及时的释放锁,允许其他线程再次获取锁进行操作
}
}
int main() {
std::thread producerThread(producerFunction);
std::thread consumerThread(consumerFunction);
//等待两个子线程都执行完,主线程再退出
producerThread.join();
consumerThread.join();
return 0;
}