c++11 多线程

C++11多线程编程基础入门 1.在C++11中创建新线程   在每个c++应用程序中,都有一个默认的主线程,即main函数,在c++11中,我们可以通过创建std::thread类的对象来创建其他线程,每个std :: thread对象都可以与一个线程相关联,只需包含头文件< thread>。可以使用std :: thread对象附加一个回调,当这个新线程启动时,它将被执行。 这些回调可以为函数指针、函数对象、... 阅读详情

线程的创建

#include<thread>

void func(){}

std::thread t(func);

Join函数将会阻塞线程,直到线程函数执行结束。如果不希望线程被阻塞执行,可以调用线程的detach()方法,将线程和对象分离,当前线程不会阻塞。

线程不能赋值,但是可以移动;

std::thread t(func);

std::thread t1(std::move(t));

线程对象t将不再不代表任何线程。

注意线程对象的声明周期,确保函数执行的过程中,thread的对象仍然是存在的。可以使用join或者detach。

线程的基本使用方法

获取线程的id和cpu的核心

std::thread t(func);

t.get_id()--------->线程的id

std::thread::hardware_concurrency()---->cpu的核心数

线程休眠

std::this_thead::sleep_for(std::chrono::seconds(3));

线程互斥量

std::mutex:独占的互斥量,不能递归使用

std::timed_mutex:带超时的独占互斥量,不能递归使用

std::recursive_mutex:递归互斥量,不带超时

std::recursive_timed_mutex:带超时的递归互斥量

1.std::mutex

std::mutex g_lock;

g_lock.lock();

..............

g_lock.unlock();

{

std::lock_guard<std::mutex> lg(g_lock);

}

2.递归独占互斥量std::recursive_mutex

递归互斥量运行同一个线程多次获得该互斥锁,用来解决同一线程需要多次获取互斥量时的死锁问题。

3.带有超时互斥量std::timed_mutex和std::recusive_timed_mutex

std:teime_mutex比std::mutex多了两个接口:try_lock_for和try_lock_until

if(mutex.try_lock_for(timeout)

条件变量

conditon_variable,配合std::unique_lock<std::mutex> 进行wait操作。

condition_variable_any,和任意带有lock、unlock语义的mutex搭配使用,效率比conditional_variable差很多。

1)拥有条件变量的线程获取互斥量

2)循环检查某个条件,如果条件不满足,则阻塞直到条件满足;如果满足,继续执行。

3)某个线程满足条件执行完后调用notify_one或notify_all唤醒一个或者所有的等待线程。

std::lock_guard<std::mutex> locker(m_mutex);

while(IsFull())

               m_notFull.wait(m_mutex);

m_notEmpty.notify_one();

wait还可以接受条件:

m_notFull.wait(locker,[this]{return !IsFull()});

wait的时候会释放锁,但是notify,notifyall的时候会获取锁。

std::unique_lock它可以随时释放锁。

std::unque_lock<std::mutex> locker(m_mutex);

m_notEmpty.wait(locker,[this]{return !m_queue.empty();});

 

原子量

std::atomic<int> value;

 

call_once/once_flag的使用

call_once确保在多线程情况下,被调用一次。

std::once_flag flag;

void do_once(){

  std::call_once(flag,[](){std::cout<<"Called once");

}

异步操作

std::future->作为异步结果的传输通道;

std::promise->将数据和future绑定起来,方便线程赋值。

std::package_task用来包装一个可调用对象,将函数和future绑定起来,方便异步调用。

std:future

获取线程的指向结果,通过查询future的状态来获取异步操作的结果。future只能move不能拷贝,如果放到容器,必须使用shared_future

future_status有如下的3种状态:

1.deferred,异步还没有开始

2.Ready,异步操作已经完成

3.Timeout,异步操作超时

status =future_wait_for(std::chrono::seconds(1));

std::future_status status;

std::promise

std::promise<int> pr;

std::thread t([](std::promise<int>& p){p.set_value_at_thread_exit(9);}, std::ref(pr));

std::future<int> f=pr.get_future();

auto r=f.get();

std::package_task

包装了一个可调用对象的包装类(如function/lambda/bind),将函数和future绑定,以便异步调用,promise保存了一个共享状态的值。

std::packaged_task<int()> task([](){return 7});

std::thread t1(std::ref(task));

std::futrue<int> f1=task.get_future();

auto r1=f1.get();

线程异步操作函数async

std::async比std::promise更高一层,异步任务返回的结果保存在future中,当需要获取异步任务的是,需要调用future.get(),如果仅仅等待执行完成,调用future.wait

有两种策略:

std::launch::async:调用async的时候开始创建线程

std::launch::defered:延迟加载方式线程,调用async时不创建线程,直到线程get或者wait时才创建线程。

 

std::future<int> f1=std::async(std::launch::async,[](){});

 

Lucene学习总结之二:Lucene的总体架构 Lucene总的来说是: 一个高效的,可扩展的,全文检索库。 全部用Java实现,无须配置。 仅支持纯文本文件的索引(Indexing)和搜索(Search)。 不负责由其他格式的文件抽取纯文本文件,或从网络中抓取文件的过程。 在Lucene in action中,Lucene 的构架和过程如下图, 说明Lucene是有索引和搜索的两个过程,包 阅读详情

相关推荐

机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾

f作者: 寒小阳 &&龙心尘 时间:2015年10月。 出处: 声明:版权所有,转载请注明出处,谢谢。手把手机器学习之逻辑回归应用——Kaggle泰坦尼克之灾1.引言先说一句,年末双十一什么的一来,真是非(mang)常(cheng)欢(gou)乐(le)!然后push自己抽出时间来写这篇blog的原因也非常简单: 写完前两篇逻辑回归的介绍和各个角度理解之后,小伙伴们纷纷表示『好像很高级的样纸,

寒小阳 43万+

【多线程/C++】阻塞队列的C++多线程 实现 BlockingQueue

阻塞队列实现: 当队列为空时,从队列获取元素的操作将会被阻塞,直到队列中被放入了元素; 当队列满时,有两种方案: 方案1: 往队列里存放元素的操作也会被阻塞,直到有元素被从队列中取出或者删除。 具体方法:定义一个条件变量std::condition_variable not_full_;在存放操作时,判断队列为满时,使用not_full_.wait(lock)阻塞线程;当进行删除队列元素的操作后,就使用not_full_.notify_all()来唤醒not_full_.wait(lock)

u011754972的博客 3417

小样本学习概述

目录 前言 小样本学习存在的意义? 什么是小样本学习? 小样本学习的方法有哪些? 结语 前言 小样本学习(Few-Shot Learning)是近几年兴起的一个研究领域,小样本学习旨在解决在数据有限的机器学习任务。 小样本学习存在的意义? 近些年,以深度卷积神经网络为代表的深度学习方法在各类机器学习任务上取得了优异的成绩——很多任务上已经超越了人类表现。狂欢背后,危机四伏。因为这些深度学习方法work的关键之一是海量标注数据的支持。 但是在工业界,很多时候难以获得海量的训练数据,更.

DwD-的博客 3万+

C++中promise和future详解

C++中promise和future详解

weixin_45312249的博客 4811

【交易系统系列27】带你看懂订单的“奇幻漂流”

作为一个在交易所后台“厨房”里摸爬滚打了十多年的老兵,我将用一杯手冲咖啡的时间,带你亲历一次完整的订单“奇幻漂流”。本文将用一个“奶爸”的生活视角,硬核拆解**撮合(Matching)**、**清算(Clearing)**、**结算(Settlement)**和**出入金**这四大核心环节。这不仅是一次对**交易系统优化**和**撮合引擎架构**的深度剖析,更是一场关于传统金融与数字金融两种不同“上菜”哲学的真实故事。

weixin_43988453的博客 407

激光测距仪DIY指南:从元器件选型到精度优化(附避坑清单)

本文提供了一份详尽的激光测距仪DIY实战指南,涵盖从核心元器件选型到系统集成的全过程。重点解析了相位法测距原理,并分享了激光发射器与APD探测器选型、信号链路设计、低成本改造方案以及精度校准等关键环节的避坑经验,帮助电子爱好者与开发者深入理解并成功搭建高精度测距系统。

h6i7j8的博客 944

c++11 多线程之future和promise

td::future 和 std:: promise

weixin_44834554的博客 4765

Unity游戏Google Play闪退?可能是这个隐藏设置惹的祸(附完整解决方案)

本文深度解析Unity游戏在Google Play上出现闪退的疑难问题,指出其根源可能在于Google Play后台的“应用完整性”设置与游戏原生库的冲突。文章提供了从崩溃日志分析、本地与线上版本对比测试,到调整Unity构建设置、审查第三方插件以及优化分发包配置的系统性排查与根治方案,帮助开发者彻底解决这一隐蔽问题。

weixin_29213827的博客 235

c++基础语法之future,promise,async详细讲解-SurfaceFlinger学习必备c++知识

std::promise用来包装一个值将数据和future绑定起来,为获取线程函数中的某个值提供便利,取值是间接通过promise内部提供的future来获取的,也就是说promise的层次比future高。这个问题回答其实可以考虑一下future的获取,future都是需要几个固定的异步线程调用方式,比如async这种,但是很多时候不喜欢用这种异步方式,那么自然也就没办法获取future,所以为了future的获取更加灵活方便,就需要有这个promise对象。

learnframework的博客 1617

从理论到实践:AI设备维护系统的架构实现

第一部分:理论基石——从设备维护的演进讲起,理解AI如何重塑维护模式;第二部分:架构设计——详解六层高可用系统架构,明确各层职责与技术选型;第三部分:核心技术——拆解数据处理、特征工程、模型训练、部署等关键环节的实现细节;第四部分:实践落地——8步流程带你从需求到上线,附代码示例与工具链;第五部分:案例研究——风电齿轮箱预测性维护系统的真实案例,从问题到方案再到效果;第六部分:挑战与展望——探讨当前技术瓶颈与未来趋势(数字孪生、联邦学习等)。准备好了吗?

大数据洞察的博客 1251

S7-200SMART通过表格指令实现模拟量信号滑动平均值滤波的具体方法

S7-200SMART通过表格指令实现模拟量信号滑动平均值滤波的具体方法

Robot_PLC_HMI_Automation 6725

C++异步编程(Promise 和 Future)

与c#(async/await)类似,c++ stl也提供类似的异步编程操作,如下文摘自ChatGPT,详细介绍了此类用法。C++11 引入了 Promise 和 FutureC++17 引入了 async/await语法在 C++11 中,和提供了一种线程间通信的方式。它们常用于一个线程(生产者)产生值,另一个线程(消费者)等待该值。这种机制被称为“承诺-未来”模式。

积累点滴,保持自我 1779

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

FreeRTOS_cpp11:为嵌入式开发带来C++11多线程支持

FreeRTOS_cpp11:为嵌入式开发带来C++11多线程支持 项目介绍 FreeRTOS_cpp11 是一个开源项目,它为 FreeRTOS 实时操作系统提供 C++11 标准的多线程支持。这意味着开发者可以在嵌入式系统中使用 C++11 中的 std::thread、std::mutex、std::condition_variable、std::chrono、std::future 等高级...

gitblog_00675的博客 1293

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【CPP】C++11多线程

在C++11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差。C++11中最重要的特性就是对线程进行支持了,使得C++在并行编程时不需要依赖第三方库,而且在原子操作中还引入了原子类的概念。要使用标准库中的线程,必须包含< thread >头文件。

m0_73865858的博客 602

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C++11多线程

这里总结一下C++11多线程的基本使用和技巧,也是个人对C++11中多线程的一些理解。 需要掌握的预备知识 std::move() 它唯一的功能是将一个左值强制转化为右值引用,继而可以通过右值引用使用该值 std::ref() 传引用, 有些api的传递引用实际上是拷贝一个副本使用这个函数则可以保证一定是引用的 目录 C++11线程创建的方式 1.函数传递方式 2.lambda表达式 3.重载运算符 4.成员函数做为线程入口 等待结束函数详解 1.使用deta...

weixin_42193704的博客 1万+

C++ 多线程基础及 C++11 多线程库总结

1. 多线程基础 1.1 进程与线程 根本区别: 进程是操作系统资源分配的基本单位,线程是任务调度和执行的基本单位 开销方面: 每个进程都有自己独立的代码和数据空间,程序之间的切换开销较大。 线程可以看作是轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器,线程之间切换开销小。 所处环境: 一个操作系统能同时运行多个进程(程序)。 在一个进程中,可以有多个线程同时执行。 内存分配方面: 系统在运行的时候会为每个进程分配不同的内存空间。 对线程而言,系统不会为

生命在于折腾! 4003

CPP多线程1:C++11的std::thread

C++11引入的std::thread是对C语言pthread的改进,提供了更便捷的多线程编程方式。文章介绍了std::thread的常用成员函数,并通过四个示例演示了其基本使用、参数传递(包括引用参数)、以及类成员函数的调用方式。关键点包括:线程的异步执行特性、使用std::ref传递引用参数、类成员函数的调用语法。最后强调了注意事项:线程在定义时即开始执行,必须调用join或detach以避免异常,强制终止线程可能导致资源泄漏。这些内容为C++多线程编程提供了基础指导。

weixin_51878399的博客 826

C++11 并发与多线程(一)

std::thread 类 1.1, 什么叫并发 concurrency? 一遍走路一边说话;你打球我游泳 单核计算机上的并发是个假象,其实只是任务切换(task switching)需要上下文切换 多处理器或一个处理器上有多个核上的并发才是自然的并发,叫硬件并发 并发种类: 1,多进程并发 这些进程间可通过正常的进程通信渠道(信号,套接字,文件,管道等) 缺点:1

嘿,逮到一只大码农 2万+

C++11多线程,锁与条件变量

C++11线程库简介 本文介绍了C++11标准库中的线程相关组件,包括thread类、原子操作库和锁管理工具。thread类支持线程创建但不允许拷贝,可通过函数指针、lambda或函数对象提供线程函数。线程参数默认值拷贝,需使用std::ref传递引用。原子操作库(atomic)提供线程安全的变量操作,避免加锁开销。lock_guard和unique_lock采用RAII机制管理互斥锁,前者简单轻量,后者支持显式锁定/解锁和锁转移。这些工具为多线程编程提供了高效安全的解决方案。<|end▁of▁sen

2301_77509762的博客 1427

C++11 的多线程示例

C++多线程类Thread(C++11) C++11中std命名空间将Boost库中的Thread加入,Boost的多线程从准标准变为标准,在深度学习以及应用程序开发中经常用到多线程,这里将其用法整理复习,以demo的形式复习,每次遇到问题或者忘记了总是百度,用完了就是忘记,好记性不如烂笔头,Goahead! 头文件为#include<thread>,通过std::thread应用。就以Hello thread开始吧,需要注意的是join()函数和detach()函数的区别,数据同步操作mu

jinking01的专栏 960

VSCode里用C/C++ Compile Run插件,编译C++11多线程代码报错?教你一键设置-std=c++11参数

本文详细介绍了在VSCode中使用C/C++ Compile Run插件编译C++11多线程代码时遇到的常见问题及解决方案。通过配置-std=c++11编译参数,开发者可以轻松解决因编译器默认标准版本过低导致的错误,并提供了进阶配置和优化建议,帮助提升开发效率。

weixin_30614109的博客 332

01C++11 多线程以及解释笔记

C++ 11 多线程学习,主要争对C++11 语法解释。

qq_43511740的博客 230

C++ 11中的多线程

C++11的标准库中提供了多线程库,使用时需要#include &lt;thread&gt;头文件,该头文件主要包含了对线程的管理类std::thread以及其他管理线程相关的类。下面是使用C++多线程库的一个简单示例: #include &lt;iostream&gt; #include &lt;thread&gt; using namespace std; void output(in...

u012043391的专栏 2287

c++11多线程

转载:https://www.cnblogs.com/wangguchangqing/p/6134635.html 说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段。并行是指两个或多个独立的操作同时进行。注意这里是同时进行,区别于并发,在一个时间段内执行多个操作。在单核时代,多个线程是并发的,在一个时间段内轮流执行;在多核时代,多个线程可以实现真正的并行,在多核上真正...

ffjffjffjffjffj的博客 240

C++11 多线程

C++11 多线程 一、基本概念 1.并发:一个核通过切换上下文运行多个线程或进程;并行:一个核运行一个进程或线程,多个核同时进行 2.进程:一个可执行程序 3.线程:进程一定含有一个主线程,主线程是唯一的,其生命周期等于进程,多线程并发,线程频繁的切换会消耗本属于进程的运行时间 4.一个进程执行完毕的标志是主线程执行完毕 二、线程详解 1.线程的基本函数 join(),主线程等待子线程执行完毕,负责回收子线程的资源。 detach(),分离线程.

m0_51735068的博客 657
上一篇: c++11-type_traits类型萃取
下一篇: c++11 chrono
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值