C++11多线程学习记录(二)

C++11多线程学习(1)atomic_flag d学了这么久我才刚刚知道C++11居然对多线程有如此丰富的支持,一方面感慨自己学的还是太少了,一方面真的很开心可以告别自己封装mutex,线程,currentthread这些东西时代了。最重要的一点,在windows上写的代码和在linux上也可以编译运行,这意味着可以使用宇宙第一IDE来调试多线程程序。我会用这个系列记录自己学习C++11多线程的过程。 C++11中引入了thread这个头文件... 阅读详情

1. 基本线程管理

所有的C++程序都至少包含一个线程(main函数所在的C++运行时线程),程序在启动主线程之后可以创建其他的线程,这些线程使用它们的初始化函数作为程序的起点(如(一)中的void hello函数),当创建线程之后我们需要启动创建的这些新的线程。

2. 线程的启动

C++线程启动的方式需要使用std::thread类来进行,大致方式如下:
使用一个函数(具体来说是可调用对象)来初始化std::thread线程对象
std::thread定义在头文件<thread>之中

void Foo();
std::thread myThread(Foo());

除了这种最常用的方式之外还有其他几种方法来初始化std::thread

  1. 使用仿函数来实现:
class Task {
public:
    void operator() const {
        foobar();
    }
};

Task t;
std::thread myThread(t);

在使用这种方式的时候需要防止产生C++中所谓的“Most vexing parse”错误,具体来说是以下一种错误:

当我们声明:std::thread myThread(Task());

我们期望的结果是:定义一个std::thread类型的变量myThread,它使用类Task变量来初始化。

实际的结果是:声明了一个函数,函数名是myThread,返回值是std::thread,形参是一个函数指针(返回值是Task对象,形参是空)

解决方式:(1)使用C++11中的初始化语法:std::thread myThread{Task()};
(2) 使用额外的一对括号:std::thread myThread ((Task()));

2. 使用C++11中的lambda表达式

std::thread myThread([](){foobar();});

3. 线程所有权的转移

std::thread线程支持所谓的“移动语义”,因此可以将std::thread进行移动,这种感觉好像是在“转移std::thread所对应的资源”,例如:

void foo();
void bar();
std::thread t1(foo);
std::thread t2 = std::move(t1) //将t1转移到t2
t1 = std::thread(bar);

这样的移动方式也可以在函数返回值中体现,也就是我们可以写出如下的代码:

std::thread f() {
    void doSomething();
    return std::thread(doSomething);
}

std::thread g() {
    void doSomething(int);
    std::thread t(doSomething, 3);
    return t;
}

std::thread支持移动,可以让线程对象存储在std::vector之中,c++11中对std::vector进行了改动,它可以存储支持“移动语义”的对象。下面的程序演示了创建若干个线程,并等待它们运行结束:

void doWork(unsigned id);

void f() {
    std::vector<std::thread> threads;
    for (unsigned i = 0; i < 20; ++i) {
        threads.push_back(std::thread(doWork(i)); //创建多个线程对象
    }
    std::for_each(threads.begin(), threads.end(),
                    std::mem_fn(&std::thread::join)); //调用它们的join方法
    }

4. 线程ID

线程ID是一个std::thread::id类型的变量,可以通过get_id获取ID值。如果一个线程对象没有一个与之关联正在执行的线程,那么get_id返回一个std::thread::id默认值对象,表示没有任何线程。另一种方式是使用std::this_thread::get_id来获取当前线程的ID。

C++ std::thread::id实例:如何获得线程id 在这个示例中,我们创建一个名为“foo”的函数,并使用std::thread t(foo)来创建一个新的线程。我们然后使用std::this_thread::get_id()方法来获取当前线程的ID,并将其打印到控制台上。std::thread::id类提供了一种简单的、可移植的方式,可以在程序运行时检查一个线程是否等于另一个线程。总结一下,std::thread::id为我们提供了一种简单的方式来获取线程的唯一标识符。C++ std::thread::id实例:如何获得线程id。 阅读详情

相关推荐

搭建适用于lammps中opls-aa力场的文件流程

现在我已经解决了以上问题,并且通过我的方法可以实现从空白文档到搭建完成以上全部内容,后期只要细心检查即可。需要的data文件最关键是获得相应阴阳离子的mmol文件,因此问题转化为构建一份mmol文件。主要用到的软件及程序:gaussian09,makemol程序(tranal),opls-aa的参数文件。二面角个数:成角原子序号及对应的参数(这里PF6的结构没有二面角,所以为0)参考文献个数:文献名(空够行数即可,这些是给自己的备忘))和自身体系对应的参考文献,修改或填入对应的参数即可。

baguette的博客 2888

标识线程std::thread::id

线程标识符是 std::thread::id 类型的,并且有两种获取方式。

kahswdbb的博客 2666

深入浅出SSD:固态存储核心技术、原理与实战(文末赠书)

作为经典畅销书的升级版,本书在第1版的基础上新增了大量新知识(如闪存、UFS、测试、文件系统等),并改写或删减了许多过时或不适用的内容,总修改量超过60%。本书由SSD技术社区SSDFans的核心团队成员联合业界、高校SSD方面的专家共同完成,相对于第1版,内容更全面、更新,也更有深度。本书从产品、技术和应用3个维度展开,全面、详细讲解了SSD的发展历史、产品形态、工作原理、整体架构,以及各个功能模块的原理和使用,从SSD的前端接口协议到FTL算法,再到后端的闪存和纠错,以及测试,本书都有涉及。

阿玥的小博客 3124

C++11线程库std::thread中提取线程id

C++有了支持多线程的thread库,只需要包含头文件#include &amp;lt;thread&amp;gt;就能使用,那么如何获取一个线程的id呢? thread中提供了std::thread::get_id()这个方法,这个方法返回的是_M_id,类型是std::thread::id: private: id _M_id; thread::id ...

FlushHip 4万+

PYNQ-Z2 开发板从镜像烧录到 Jupyter 交互全流程指南

本文详细介绍了PYNQ-Z2开发板从镜像烧录到Jupyter交互的全流程指南,包括硬件解析、镜像烧录技巧、设备启动与网络配置、Jupyter Notebook深度使用以及实战案例分享。通过具体步骤和实用技巧,帮助开发者快速上手PYNQ-Z2开发板,实现高效的FPGA开发和智能家居控制应用。

weixin_28736355的博客 440

FUXA实战:5步搞定基于Web的SCADA系统搭建(含Node.js版本避坑指南)

本文提供了一份基于开源工具FUXA搭建Web版SCADA系统的实战指南。文章重点解析了从环境准备到生产部署的五个核心步骤,并特别强调了Node.js版本选择对西门子S7 PLC通信兼容性的关键影响,帮助开发者避开常见陷阱,快速构建工业监控界面。

weixin_29172963的博客 140

std::thread::id如何转换为字符串或整数

【代码】std::thread::id如何转换为字符串或整数。

MYMarcoreus的博客 2634

openclaw通俗入门系列4——智能体工作区

工作区 = 智能体的家,存放它的性格、记忆、技能。默认不是牢笼(可以用沙箱隔离)。建议放到私有 Git 备份,但绝对不要提交密钥!

m0_60605453的博客 462

C++11 std::thread::id

C++11 std::thread::id其实是一个内部类:class thread{ ...     class id{         ...     }; ... };id里面有一个私有的类似typedef unsigned long int pthread_t;的数据成员。当初遇到id的时候以为它就是一个类似int的东西。在程序的某个地方需要一个数值的id,需要std::this_thre...

rasishou的博客 3269

Stable Diffusion 模型分享:Indigo Furry mix(人类与野兽的混合)

Indigo Furry mix 是一个混合模型,出的图具有雄性人类的体型和野兽的形态。条目内容类型大模型基础模型SD 1.5来源CIVITAI作者indigowing文件名称文件大小1.99GB。

水滴的博客 1830

23、关联挖掘到相关性分析及约束关联挖掘详解

本文详细解析了从关联挖掘到相关性分析的发展过程,以及基于约束的关联挖掘方法。文章介绍了传统支持-置信度框架的局限性,并引入Lift、χ2、All Confidence和Cosine等度量来评估规则的相关性。同时探讨了多种规则约束在数据挖掘中的应用机制及其优化效果,旨在提高挖掘效率和规则质量。最后结合实际案例说明如何综合运用相关性度量与规则约束以满足业务需求,并展望了数据挖掘技术的未来发展。

aa123的博客 103

C++11 并发与多线程学习记录(二)

初涉线程 线程的开始 主线程从main函数开始,自己创建的线程则需要提供一个可调用对象。函数执行完毕,线程就退出。 线程的结束 主线程退出后,整个进程也将执行完毕。 一般情况下,如果其它子线程也还没执行完毕,随着主线程退出,子线程也将被操作系统全部中止。 线程头文件 #include <thread> thread类介绍 join()函数,阻塞主线程,主线程等待子线程执行完毕。 d...

Hugh_Nuoya的博客 247

如何用DeepSeek写年底工作总结?——从入门到精通的全流程指南

AI助手DeepSeek如何高效撰写工作总结 摘要:本文介绍如何利用DeepSeek智能AI助手高效完成工作总结写作。工作总结具有结构固定、语言规范、内容数据化三大特性,而DeepSeek的结构化生成、风格适配、数据整合和迭代优化四大核心能力与之完美匹配。文章提出"准备-搭架-填充-优化"四步工作法:1)精准输入岗位、时间范围等核心信息;2)先搭建逻辑清晰的提纲框架;3)分模块填充具体内容,突出数据与案例;4)通过风格润色和细节补充进行优化。通过合理运用多模态材料处理能力,DeepSee

通俗易懂学IT 288

记录一些优秀的开源CPP项目

这个完全可以学习一下,C++ REST SDK是一个轻量级的C++11库,它可以用于创建异步RESTful Web服务。这个库的代码风格清晰简洁,代码量在5000行左右,非常易于阅读和理解。这个库的代码量在5000行以上,但是它的代码风格非常清晰,非常易于阅读和理解。搜狗正在使用的后端框架,支持几乎所有搜狗后端在线服务,包括搜索服务、云输入发、广告接口等,每天超百亿请求。简单的cpp服务器,作者还写了讲解相关代码和原理的文章,对于初学者掌握网络编程相关知识很有帮助。字符串处理,格式化,系列化,等等。

m0_63513270的博客 3496

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C++11多线程编程系列(二)实战

C++11 新标准中引入了多个头文件来支持多线程编程,他们分别是&amp;amp;amp;amp;amp;amp;amp;amp;lt;atomic&amp;amp;amp;amp;amp;amp;amp;amp;gt; ,&amp;amp;amp;amp;amp;amp;amp;amp;lt;thread&amp;amp;amp;amp;amp;amp;amp;amp;gt;,&amp;amp;amp;amp;amp;amp;amp;amp;lt;mutex&amp

zhougb3的博客 7289

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

c++11 多线程学习记录

#include<iostream> #include<thread> using namespace std; void func1(){ cout<<"func1 thread id "<<this_thread::get_id()<<endl; cout<<"begin func1"<<endl; for(int i=0;i<10;i++){ // this_thread:

wzzzj的博客 988

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C/C++编程:log4cpp使用学习

简介 Log4cpp是一个开源的C++类库,它提供了在C++程序中使用日志和跟踪调试的功能。使用log4cpp,可以很便利地将日志或者跟踪调试信息写入字符流、内存字符串队列、文件、回滚文件、调试器、Windows日志、本地syslog和远程syslog服务器中。 Log4cpp有如下优点: 提供了可扩展的多种日志记录方式; 提供了NDC(嵌套诊断上下文),可用于多线程、多场景的跟踪调试; 提供了完整的日志动态优先级控制,可随时调整需要记录的日志优先级 可通过配置文件完成所有配置并动态加载; 性能优秀,内存

OceanStar的博客 4019

【亲测免费】 C++11 日志库cpp11logger实战指南

C++11 日志库cpp11logger实战指南 项目介绍 cpp11logger是一款专为C++11设计的轻量级日志库,它提供了现代C++特性以简化日志管理过程。此库旨在提供高效、灵活的日志记录解决方案,适用于从简单的控制台应用到复杂的分布式系统。通过利用C++11的标准化特性和线程局部存储(如thread_local),cpp11logger确保了在多线程环境中的安全与便捷。 项目快速启动 安...

gitblog_00792的博客 488

C++11多线程学习记录(一)

C++ 11 多线程 一

Frank的专栏 3826

C++11的多线程并发编程(二)

C++11的多线程并发编程(二) 疫情已到确诊3w+,望早日结束这疫情。 根据上一节学习的的线程概念,开始进一步学习C++11新标准的多线程编程,C++11引入了5个头文件,分别是:atomic, thread, mutex, condition_variable, future。主要包含互斥类,条件变量,同步线程和异步线程等的相关类,这一节主要记录thread头文件的相关内容。 线程的创建st...

COMEDY_lang的博客 797

C++11 并发指南一(C++11 多线程初探)

C++11 并发指南一(C++11 多线程初探) 2013-08-03 22:27 by Haippy,114800阅读,4评论,收藏,编辑 引言 C++11 自2011年发布以来已经快两年了,之前一直没怎么关注,直到最近几个月才看了一些 C++11 的新特性,今后几篇博客我都会写一些关于 C++11 的特性,算是记录一下自己学到的东西吧,和大家共勉。 相信 Linux 程序员...

Poo_Chai的博客 142

C++11多线程(一) 创建线程

写在前面,本文是本人学习过程中类似于笔记的记录,如有疑问或错误可在评论区指出。 请勿转载,谢谢观看。 文章目录C++11多线程(一) 简单使用创建线程创建线程的其他方法一、函数对象二、匿名函数三、成员变量四、补充 C++11多线程(一) 简单使用 创建线程 最简单的方法如下: #include<iostream> #include<thread> using namespace std; void f() {// cout << "正在执行 id:" <<

AczQc的博客 2119

c++多线程记录学习

1. 重要概念: 参考链接:https://blog.youkuaiyun.com/m0_37621078/article/details/88608675 C++11新标准多线程支持库 < thread > :包含std::thread类以及std::this_thread命名空间。管理线程的函数和类的声明; < atomic > :包含std::atomic和std::atom...

爱CV 402

C++11:多线程(1)

前言 之前的工作项目基本不使用多线程,一直对多线程的理解比较浅显,一般应用也是主从两个线程,也不涉及资源锁,以及其他的各种锁,信号量之类的,更别提线程池之类的,这次也特意学习记录一下多线程。 库知识 C++11现在也有了自己的多线程库,从C++11的线程库开始学习了解。 库主要分为: #include <thread> #include <mutex> #include ...

u011218356的博客 1790
上一篇: C++11多线程学习记录(一)
下一篇: 设计模式之单例模式(C++)
csxiaoshui
博客等级 码龄16年 873粉丝 158原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值