C++并发编程(四):同步并发操作

本文详细介绍了C++中的同步并发操作,包括使用条件变量等待线程、期望等待一次性事件,如future和promise,以及限时等待的实现。讨论了std::condition_variable、std::future、std::packaged_task和std::promise等工具的用法,并阐述了如何处理异常和多个线程等待。此外,还解释了时延和绝对时间等待的不同方法。
摘要由CSDN通过智能技术生成

使用条件变量等待线程


c++提供了std::condition_variablestd::condition_variable_any来实现线程之间的条件等待,它们声明在<condition_variable>头文件。condition_variable必须和一个mutex互斥量来协同工作,condition_variable_any则可以任何互斥量一起工作,更加通用,但是开销和体积更大。只有当对灵活性有硬性要求时,我们才会考虑condition_variable_any。

std::mutex mut;
std::queue<data_chunk> data_queue;
std::condition_variable data_cond;
void data_preparation_thread()
{
    while(true)
    {
        data_chunk const data=get_data();
        std::lock_guard<std::mutex> lk(mut);
        data_queue.push(data);
        data_cond.notify_one(); //通知等待线程,可以被唤醒
    }
}
void data_processing_thread()
{
    while(true)
    {
        std::unique_lock<std::mutex> lk(mut); 
        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;
    }
}

我们有一个不断往队列里加元素的线程,还有一个不断元素的线程。condition_variable调用wait函数来开启条件等待。wait()接收一个互斥量和一个函数。这个函数就是判断等待的条件。上述代码使用一个lamda表达式,队列为空时返回false,不不为空时为true。当队列不为空时,线程会继续往下运行。当队列为空时,条件变量会解锁互斥量,并使当前线程进入等待状态。

在添加元素的线程中,完成元素添加操作之后,需要调用notify_one()函数来唤醒等待中的线程。等待中的线程被唤醒后,会加锁互斥量,并重新检查条件函数。条件函数除了使用lamda表达式,普通的函数也是可以的。

使用期望等待一次性事件


c++标准库提供了std::future<>和std::shard_future<>两种期望。future只能和一个指定事件相关联,shared_future可以关联多个事件。

1、带返回值的线程

thread并没有返回值,当我们需要有返回值的线程时,可以使用std::async。async会返回一个future对象,这个对象持有最后的返回结果。我们可以使用这个对象的get函数来获取结果。async并不像thread一样,必须立即等待线程结束,我们可以在任何想获取结果的时候使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值