【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

系统自己选择合适的


相关文章
|
15天前
|
缓存 安全 C++
C++无锁队列:解锁多线程编程新境界
【10月更文挑战第27天】
30 7
|
15天前
|
消息中间件 存储 安全
|
21天前
|
存储 并行计算 安全
C++多线程应用
【10月更文挑战第29天】C++ 中的多线程应用广泛,常见场景包括并行计算、网络编程中的并发服务器和图形用户界面(GUI)应用。通过多线程可以显著提升计算速度和响应能力。示例代码展示了如何使用 `pthread` 库创建和管理线程。注意事项包括数据同步与互斥、线程间通信和线程安全的类设计,以确保程序的正确性和稳定性。
|
1月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
45 6
|
1月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
23 0
C++ 多线程之线程管理函数
|
1月前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
43 1
C++ 多线程之初识多线程
|
23天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
16 3
|
23天前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
16 2
|
23天前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
28 2
|
23天前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
28 1