【C++11】C++多线程之条件变量,异步启动任务(1)

简介: 【C++11】C++多线程之条件变量,异步启动任务(1)

前言

条件变量以及异步任务(1)


提示:以下是本篇文章正文内容,下面案例可供参考

一、condition_varible

定义一个条件变量condition_varible v;

1、condition_varible的使用

1).condition_varible::wait

等待notify_one 唤醒执行参数2,如果为true,则继续执行下面的代码,如果为false则继续等待下一次

参数1:unique_lock的的变量,参数2:lambda表示式/函数()。本次演示的是lambda表达式,函数是一样的

condition_varible con;
mutex _1;
unique_lock<mutex> uni(m);
list l;
con.wait(uni,[this]{
if(!l.empty())
  return true;//继续执行下一行代码
else
  return false;//继续等待下次唤醒
});//我演示的是在类中的写法
//.........

2)condition_varible::notify_one

作用:用来唤醒一个condition_varible的变量。

使用:直接在另一个线程调用他就行。

2、condition_varible一个问题及解决

解决方案,一次把全部都唤醒

代码

使用函数:condition_varible::notify_all()

便可唤醒所以有condition_varible::wait的线程

作业

设计一个程序,一个子线程放入数据,另一个子线程拿出数据。使用条件变量

二、异步任务async,future

1、async的使用

意义:执行线程并获取线程的返回值返回到future中

与thread的区别:

thread

创建失败会奔溃

thread需要使用全局接返回值

async

创建失败会直接在主线程中执行线程入口函数

async可以使用get()接返回值

使用:

1).头文件:#include <future>

2).使用async函数:async(入口函数);

怎么获取返回的值呢?请看下面

2、future的使用

future:未来的意思

也是获取async线程返回值的类模板

使用:future<int> f = async(入口函数);

如何获取值呢:f.get(),什么意思呢?等待子线程执行完并获取值

等待子线程执行完:f.wait(),但不获取值

1、future其他

1)、想多次调用get()/wait()咋办

使用shared_future,也是一个类模板,但是是future的类模板

使用方法:

shared_future<int> sf = f;//1.
shared_future<int> sf2(move(f));//2.
sf.get();
sf2.get();

2).查看future是否成功返回值

.future::valid()

成功ture,失败false

3、async与future的联合

int fun()
{
  cout<<"fun start"<<endl;
  Sleep(5000);//延时5秒,模拟工作
  cout<<"fun end"<<endl;
}
int main()
{
  future<int> f = async(fun);
  shared_future<int> sf(move(f));
  if(f.valid())
  {
    cout<<"成功返回值:"<<sf.get()<<endl;
    cout<<"成功返回值:"<<sf.get()<<endl;
    cout<<"成功返回值:"<<sf.get()<<endl;
    cout<<"成功返回值:"<<sf.get()<<endl;
    cout<<"成功返回值:"<<sf.get()<<endl;
    cout<<"成功返回值:"<<sf.get()<<endl;
    cout<<"成功返回值:"<<sf.get()<<endl;
  }
  return 0;
}

4、async第一个参数

介绍launch:一个枚举值

1).launch::async

强制async创建一个线程

2).launch::deferred

不创建新的线程,而把线程入口函数当普通的函数在主函数中执行

他必须要wait()/get(),要不然会异常

3).如果不指定

launch::async|launch::deferred

系统自己选择合适的


相关文章
|
12月前
|
存储 C++
C++语言中指针变量int和取值操作ptr详细说明。
总结起来,在 C++ 中正确理解和运用 int 类型地址及其相关取值、设定等操纵至关重要且基础性强:定义 int 类型 pointer 需加星号;初始化 pointer 需配合 & 取址;读写 pointer 执向之处需配合 * 解引用操纵进行。
803 12
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
608 12
|
存储 Java 数据库
如何处理线程池关闭时未完成的任务?
总之,处理线程池关闭时未完成的任务需要综合考虑多种因素,并根据实际情况选择合适的处理方式。通过合理的处理,可以最大程度地减少任务丢失和数据不一致等问题,确保系统的稳定运行和业务的顺利开展。
781 64
|
消息中间件 监控 Java
线程池关闭时未完成的任务如何保证数据的一致性?
保证线程池关闭时未完成任务的数据一致性需要综合运用多种方法和机制。通过备份与恢复、事务管理、任务状态记录与恢复、数据同步与协调、错误处理与补偿、监控与预警等手段的结合,以及结合具体业务场景进行分析和制定策略,能够最大程度地确保数据的一致性,保障系统的稳定运行和业务的顺利开展。同时,不断地优化和改进这些方法和机制,也是提高系统性能和可靠性的重要途径。
464 62
|
存储 机器学习/深度学习 编译器
【C++终极篇】C++11:编程新纪元的神秘力量揭秘
【C++终极篇】C++11:编程新纪元的神秘力量揭秘
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
576 17
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
387 12
|
数据采集 Java 数据处理
Python实用技巧:轻松驾驭多线程与多进程,加速任务执行
在Python编程中,多线程和多进程是提升程序效率的关键工具。多线程适用于I/O密集型任务,如文件读写、网络请求;多进程则适合CPU密集型任务,如科学计算、图像处理。本文详细介绍这两种并发编程方式的基本用法及应用场景,并通过实例代码展示如何使用threading、multiprocessing模块及线程池、进程池来优化程序性能。结合实际案例,帮助读者掌握并发编程技巧,提高程序执行速度和资源利用率。
853 0
|
缓存 安全 C++
C++无锁队列:解锁多线程编程新境界
【10月更文挑战第27天】
1226 7
|
消息中间件 存储 安全