【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

系统自己选择合适的


相关文章
|
2月前
|
编解码 数据安全/隐私保护 计算机视觉
Opencv学习笔记(十):同步和异步(多线程)操作打开海康摄像头
如何使用OpenCV进行同步和异步操作来打开海康摄像头,并提供了相关的代码示例。
118 1
Opencv学习笔记(十):同步和异步(多线程)操作打开海康摄像头
|
1月前
|
缓存 安全 C++
C++无锁队列:解锁多线程编程新境界
【10月更文挑战第27天】
55 7
|
1月前
|
消息中间件 存储 安全
|
2月前
|
存储 并行计算 安全
C++多线程应用
【10月更文挑战第29天】C++ 中的多线程应用广泛,常见场景包括并行计算、网络编程中的并发服务器和图形用户界面(GUI)应用。通过多线程可以显著提升计算速度和响应能力。示例代码展示了如何使用 `pthread` 库创建和管理线程。注意事项包括数据同步与互斥、线程间通信和线程安全的类设计,以确保程序的正确性和稳定性。
|
2月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
82 6
|
2月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
42 0
|
2月前
|
安全 调度 C#
STA模型、同步上下文和多线程、异步调度
【10月更文挑战第19天】本文介绍了 STA 模型、同步上下文和多线程、异步调度的概念及其优缺点。STA 模型适用于单线程环境,确保资源访问的顺序性;同步上下文和多线程提高了程序的并发性和响应性,但增加了复杂性;异步调度提升了程序的响应性和资源利用率,但也带来了编程复杂性和错误处理的挑战。选择合适的模型需根据具体应用场景和需求进行权衡。
|
2月前
|
网络协议 安全 Java
难懂,误点!将多线程技术应用于Python的异步事件循环
难懂,误点!将多线程技术应用于Python的异步事件循环
86 0
|
2天前
|
NoSQL Redis
单线程传奇Redis,为何引入多线程?
Redis 4.0 引入多线程支持,主要用于后台对象删除、处理阻塞命令和网络 I/O 等操作,以提高并发性和性能。尽管如此,Redis 仍保留单线程执行模型处理客户端请求,确保高效性和简单性。多线程仅用于优化后台任务,如异步删除过期对象和分担读写操作,从而提升整体性能。
12 1
|
2月前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
58 1