【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

系统自己选择合适的


相关文章
|
1月前
|
Java 开发者
解锁并发编程新姿势!深度揭秘AQS独占锁&ReentrantLock重入锁奥秘,Condition条件变量让你玩转线程协作,秒变并发大神!
【8月更文挑战第4天】AQS是Java并发编程的核心框架,为锁和同步器提供基础结构。ReentrantLock基于AQS实现可重入互斥锁,比`synchronized`更灵活,支持可中断锁获取及超时控制。通过维护计数器实现锁的重入性。Condition接口允许ReentrantLock创建多个条件变量,支持细粒度线程协作,超越了传统`wait`/`notify`机制,助力开发者构建高效可靠的并发应用。
72 0
|
17天前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
|
17天前
|
存储 Ubuntu Linux
C语言 多线程编程(1) 初识线程和条件变量
本文档详细介绍了多线程的概念、相关命令及线程的操作方法。首先解释了线程的定义及其与进程的关系,接着对比了线程与进程的区别。随后介绍了如何在 Linux 系统中使用 `pidstat`、`top` 和 `ps` 命令查看线程信息。文档还探讨了多进程和多线程模式各自的优缺点及适用场景,并详细讲解了如何使用 POSIX 线程库创建、退出、等待和取消线程。此外,还介绍了线程分离的概念和方法,并提供了多个示例代码帮助理解。最后,深入探讨了线程间的通讯机制、互斥锁和条件变量的使用,通过具体示例展示了如何实现生产者与消费者的同步模型。
|
29天前
|
存储 监控 Java
|
29天前
|
存储 安全 C++
C++:指针引用普通变量适用场景
指针和引用都是C++提供的强大工具,它们在不同的场景下发挥着不可或缺的作用。了解两者的特点及适用场景,可以帮助开发者编写出更加高效、可读性更强的代码。在实际开发中,合理选择使用指针或引用是提高编程技巧的关键。
23 1
|
8天前
|
JavaScript 前端开发 Java
通过Gtest访问C++静态、私有、保护变量和方法
通过Gtest访问C++静态、私有、保护变量和方法
8 0
|
1月前
|
Java 调度
基于C++11的线程池
基于C++11的线程池
|
21天前
|
前端开发 JavaScript 大数据
React与Web Workers:开启前端多线程时代的钥匙——深入探索计算密集型任务的优化策略与最佳实践
【8月更文挑战第31天】随着Web应用复杂性的提升,单线程JavaScript已难以胜任高计算量任务。Web Workers通过多线程编程解决了这一问题,使耗时任务独立运行而不阻塞主线程。结合React的组件化与虚拟DOM优势,可将大数据处理等任务交由Web Workers完成,确保UI流畅。最佳实践包括定义清晰接口、加强错误处理及合理评估任务特性。这一结合不仅提升了用户体验,更为前端开发带来多线程时代的全新可能。
22 0
|
2月前
|
存储 SQL Java
(七)全面剖析Java并发编程之线程变量副本ThreadLocal原理分析
在之前的文章:彻底理解Java并发编程之Synchronized关键字实现原理剖析中我们曾初次谈到线程安全问题引发的"三要素":多线程、共享资源/临界资源、非原子性操作,简而言之:在同一时刻,多条线程同时对临界资源进行非原子性操作则有可能产生线程安全问题。
|
1月前
|
Cloud Native Java 调度
项目环境测试问题之线程同步器会造成执行完任务的worker等待的情况如何解决
项目环境测试问题之线程同步器会造成执行完任务的worker等待的情况如何解决

相关实验场景

更多