【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

系统自己选择合适的


相关文章
|
数据采集 存储 JSON
Python爬取知乎评论:多线程与异步爬虫的性能优化
Python爬取知乎评论:多线程与异步爬虫的性能优化
|
编解码 数据安全/隐私保护 计算机视觉
Opencv学习笔记(十):同步和异步(多线程)操作打开海康摄像头
如何使用OpenCV进行同步和异步操作来打开海康摄像头,并提供了相关的代码示例。
1564 1
Opencv学习笔记(十):同步和异步(多线程)操作打开海康摄像头
|
存储 C++
C++语言中指针变量int和取值操作ptr详细说明。
总结起来,在 C++ 中正确理解和运用 int 类型地址及其相关取值、设定等操纵至关重要且基础性强:定义 int 类型 pointer 需加星号;初始化 pointer 需配合 & 取址;读写 pointer 执向之处需配合 * 解引用操纵进行。
848 12
|
数据采集 监控 调度
干货分享“用 多线程 爬取数据”:单线程 + 协程的效率反超 3 倍,这才是 Python 异步的正确打开方式
在 Python 爬虫中,多线程因 GIL 和切换开销效率低下,而协程通过用户态调度实现高并发,大幅提升爬取效率。本文详解协程原理、实战对比多线程性能,并提供最佳实践,助你掌握异步爬虫核心技术。
|
缓存 安全 Java
面试中的难题:线程异步执行后如何共享数据?
本文通过一个面试故事,详细讲解了Java中线程内部开启异步操作后如何安全地共享数据。介绍了异步操作的基本概念及常见实现方式(如CompletableFuture、ExecutorService),并重点探讨了volatile关键字、CountDownLatch和CompletableFuture等工具在线程间数据共享中的应用,帮助读者理解线程安全和内存可见性问题。通过这些方法,可以有效解决多线程环境下的数据共享挑战,提升编程效率和代码健壮性。
553 6
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
599 17
|
缓存 安全 C++
C++无锁队列:解锁多线程编程新境界
【10月更文挑战第27天】
1246 7
|
消息中间件 存储 安全
|
存储 并行计算 安全
C++多线程应用
【10月更文挑战第29天】C++ 中的多线程应用广泛,常见场景包括并行计算、网络编程中的并发服务器和图形用户界面(GUI)应用。通过多线程可以显著提升计算速度和响应能力。示例代码展示了如何使用 `pthread` 库创建和管理线程。注意事项包括数据同步与互斥、线程间通信和线程安全的类设计,以确保程序的正确性和稳定性。
674 5
|
安全 调度 C#
STA模型、同步上下文和多线程、异步调度
【10月更文挑战第19天】本文介绍了 STA 模型、同步上下文和多线程、异步调度的概念及其优缺点。STA 模型适用于单线程环境,确保资源访问的顺序性;同步上下文和多线程提高了程序的并发性和响应性,但增加了复杂性;异步调度提升了程序的响应性和资源利用率,但也带来了编程复杂性和错误处理的挑战。选择合适的模型需根据具体应用场景和需求进行权衡。
557 0

热门文章

最新文章