多线程()

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;
}

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值