当前位置: 首页 > news >正文

C++并发多线程--std::future_status、std::shared_future和std::atomic的使用

1--std::future_status的使用

        std::future_status成员函数含有三种状态:timeout(执行超时)、ready(执行完毕)和deferred(延迟执行),其中 deferred 状态需要用 std::launch::deferred 对线程进行设置,使其延迟直到 get() 或者 wait() 被调用;

#include <iostream>
#include <thread>
#include <mutex>
#include <future>class Sample{
public:// 线程入口函数int thread(int value){std::cout << "thread id: " << std::this_thread::get_id() << std::endl;std::chrono::seconds dura(value); // reststd::this_thread::sleep_for(dura);return 5;}};int main(int argc, char *argv[]){Sample sample;int value = 5;std::cout << "thread id: " << std::this_thread::get_id() << std::endl;std::future<int> result = std::async(&Sample::thread, &sample, value);// 等待1sstd::future_status status = result.wait_for(std::chrono::seconds(1));if (status == std::future_status::timeout){ // 超时,因为线程里面睡眠了5s// if判断为true,表明线程还没执行完,超时了std::cout << "thread timeout!" << std::endl;}else if(status == std::future_status::ready){ // 线程在等待期间成功返回std::cout << "result.get(): " << result.get() << std::endl;}// std::launch::deferred设置延迟执行状态// std::future<int> result = std::async(std::launch::deferred, &Sample::thread, &sample, value);else if(status == std::future_status::deferred){ // 延迟执行状态std::cout << "deferred, result.get(): " << result.get() << std::endl;}std::cout << "main thread continue ..." << std::endl;return 0;
}

2--std::shared_future的使用

        由于 std::future 对象只能被 get() 一次(get()的实现基于移动语义),当多个线程都需要 std::future 对象 get() 的结果时,就会出错;

        std::shared_future 对象可以很好地解决上述问题;

#include <iostream>
#include <thread>
#include <mutex>
#include <future>// 线程入口函数
int thread(int value){std::cout << "thread id: " << std::this_thread::get_id() << std::endl;std::chrono::seconds dura(value); // reststd::this_thread::sleep_for(dura);return 5;
}int main(int argc, char *argv[]){// std::packaged_task 打包任务std::cout << "thead id: " << std::this_thread::get_id() << std::endl;std::packaged_task<int(int)> mypt(thread);int value = 5;std::thread thread1(std::ref(mypt), value);thread1.join();// std::future<int> result = mypt.get_future(); // std::future对象std::shared_future<int> share_result(mypt.get_future()); // std::shared_future对象// 可以多次调用std::cout << "result.get(): " << share_result.get() << std::endl;std::cout << "result.get(): " << share_result.get() << std::endl;return 0;
}

3--std::atomic的使用

主要思路:

        

http://www.lryc.cn/news/131325.html

相关文章:

  • Redis在Java中的基本使用
  • 4.2 C++ Boost 内存池管理库
  • Django模型基础
  • 导读-Linux简介
  • 判断平面中两射线是否相交的高效方法
  • 基于VUE3+Layui从头搭建通用后台管理系统(前端篇)八:自定义组件封装上
  • RabbitMq交换机类型介绍
  • 中国电信秋招攻略,考试内容分析
  • prompt-engineering-note(面向开发者的ChatGPT提问工程学习笔记)
  • 2011-2021年数字普惠金融指数Bartik工具变量法(含原始数据和Bartik工具变量法代码)
  • [ MySQL ] — 常见函数的使用
  • Spring AOP实现切入增强的两种方式(execution+annotation)-Demo
  • 人工智能在网络安全中的作用:当前的局限性和未来的可能性
  • BC99 序列中整数去重
  • [PyTorch][chapter 52][迁移学习]
  • Ceph如何操作底层对象数据
  • sklearn机器学习库(二)sklearn中的随机森林
  • FlutterBoost 实现Flutter页面内嵌iOS view
  • 走嵌入式还是纯软件?学长告诉你怎么选
  • 【云计算原理及实战】初识云计算
  • Open3D (C++) 基于拟合高差的点云地面点提取
  • 认识Transformer:入门知识
  • 《TCP IP网络编程》第二十四章
  • 【AI】文心一言的使用
  • CSAPP Lab2:Bomb Lab
  • Java中使用流将两个集合根据某个字段进行过滤去重?
  • 自动驾驶HMI产品技术方案
  • Git判断本地是否最新
  • Spring 整合RabbitMQ,笔记整理
  • Lua 语言笔记(一)