C++ thread多线程的几种方法_c++多线程实现的四种方式-程序员宅基地

技术标签: c++  多线程  

进程与线程:

一个程序创建运行就是一个进程,一个进程有一个主线程,主线程唯一
主线程执行main函数中的代码,当main函数执行完毕,主线程终止,其生命周期与进程一致。
在主线程以外可以通过代码创建其他线程来执行函数或者其他程序。
c++头文件 :

#include <thread>

创建线程一:

线程执行函数
例如要创建线程执行函数 hello()

void hello()
{
    
cout<<"hello"<<endl;
}

只需要在函数里面调用创建线程调用:

void main()
{
    
......
thread t1(hello);
......
t1.join();
return 0;
}

join()
这里提到了一个join()函数,他表示阻塞主程序,当主线程等待子线程执行完后,主线程才开始往下走。
detach()
当主线程需要等待多子线程执行结束,这在有些情况下不太好,于是出现了detach()这个函数,这个函数使主线程不需要等待子线程执行完成,当主线程执行完毕,子线程还没执行完时,这时子线程会被系统后台接管运行,当这些个线程执行完毕后,由运行库负责清理该进程相关的资源。

thread mythread(hello);
mythread.detach();

detach()使线程失去我们自己的控制,由后台接管。
通常情况下主线程等子线程。一旦detach()之后不能再用join(),最常用的是要控制线程的生命周期。

joinable()
判断是否可以成功使用join()或者detach()

创建线程二:

通过类构造一个可调用对象

//不带参数
class Mythread{
    
public:
	void operator()()
	{
    
	cout<<"strat a thread success!"<<endl;
	}
};
//类对象
Mythread mytd;
thread mythread(mytd);
mythread.join();

thread 参数传递
参数注意生命周期问题:

#include <iostream>
#include <thread>
using namespace std;
void func_str(const string & str)
{
    
   cout << "data is  " << str << '\n';
}
void start_thread(void)
{
    
  char buffer[6] = {
    'a','b','c','d','e','\0'};
  thread t(func_str, string(buffer));
  t.join();
}
int main(int argc, char** argv)
{
    
  thread t1(start_thread);
  t1.join();
  return 0;
}

创建线程三:

Lambda函数
lambda函数(匿名函数)是一个纯函数体,没有名字。它可以在适当的位置调用。lambda函数可以捕获它的调用上下文。这就是为什么他们经常被称为闭包。

#include <iostream>
#include <thread>

int main()
{
    
  std::thread t([]()
  {
    
    std::cout << "thread function\n";
  });
  std::cout << "main thread\n";
  t.join();
  return 0;
}


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/pluto_rx/article/details/114751399

智能推荐

java.lang.NoSuchMethodError: org.springframework.util.StringUtils.matchesCharacter的解决方式-程序员宅基地

文章浏览阅读7.5k次。报错之后,我直接搜索StringUtils这类在哪个包下,答案是org.springframework.core包下,但是我项目有这个包的依赖,lib下也引入了,就应该不是缺包的问题,仔细搜索有人说是jar包冲突。于是我将lib下的jar包全部删除,多次重启Tomcat,看日志提示缺那个包就引入哪个包,最后能访问项目了。左上角file→project settings→Artifacts ,如下图上图是我成功之后的lib目录,把lib目录下的jar包delete键所有。然后重启Tomcat,会持续报_java.lang.nosuchmethoderror: org.springframework.util.stringutils.matchescha

thinkphp5.0 数据库基本操作(一)_// 服务器地址 'hostname' => '127.0.0.1', // 数据库名 'datab-程序员宅基地

文章浏览阅读1.1k次。链接数据库一共有三种模式,一般第一种就够了第一种直接配置application里面的database.php文件// 服务器地址'hostname' =&amp;amp;amp;gt; '127.0.0.1',// 数据库名'database' =&amp;amp;amp;gt; 'yachang',// 用户名'username' =&amp;amp;amp;gt; 'root',// 密码..._// 服务器地址 'hostname' => '127.0.0.1', // 数据库名 'database' => 'leave',

AD软件绘制复杂不规则焊盘之带挖空区域的焊盘_ad软件region怎么画-程序员宅基地

文章浏览阅读4k次,点赞7次,收藏22次。AD 不规则焊盘 绘制 挖空焊盘_ad软件region怎么画

h5+vue页面下滑查看更多 页面触底+页面滑动_网页一次只显示10个下拉显示更多怎么做-程序员宅基地

文章浏览阅读1.6k次。h5页面触底,不足一屏触发滑动 超过一屏触发触底效果解决 页面大屏正好一屏,小屏超过一屏 页面下滑查看更多 的问题解决方法1 超过一屏监听滚动 触底触发 小于或等于一屏监听触摸 上滑触发 data() { return { startY: 0, endY: 0, Fullscreen: true }; },添加触摸事件 //给触摸区域添加触摸事件 <div @touchstart="touchstart()" @_网页一次只显示10个下拉显示更多怎么做

VB的常用内部控件简介_vb 常用控件-程序员宅基地

文章浏览阅读2k次。这十天以来,重复着在视频与百例之间往返的学习生活,说VB无聊,其实很有意思,尤其是先看见一个比较新奇的小程序,然后自己折腾出来的那种喜悦是继续坚持的一种动力。 最近这两天有些不在状态了,一集视频没看完或者是百例没看几页就想干别的事,其实心还是浮躁的,得赶紧调整过来继续学习,在这里反省一下。 其实看见大家这些天的一些关于VB的博客,想到自己关于VB的学习还没写博客,于是就把最近整_vb 常用控件

js 破解 xxxx安全xx共享平台 cookie_xxww69aa-程序员宅基地

文章浏览阅读4.6w次。import requestsimport execjsimport reimport jsonurl = "https://www.cnvd.org.cn/"s = requests.session()one_req = s.get(url,verify=False)pp = re.search("cookie=(.*);location",one_req.text,re.S)res2 = execjs.eval(pp.group(1))ck = res2.split(';')[0._xxww69aa

随便推点

Zookeeper原理篇-Zookeeper启动流程分析(1)_zkt开发流程详解-程序员宅基地

文章浏览阅读734次,点赞26次,收藏21次。谈到面试,其实说白了就是刷题刷题刷题,天天作死的刷。。。。。为了准备这个“金三银四”的春招,狂刷一个月的题,狂补超多的漏洞知识,像这次美团面试问的算法、数据库、Redis、设计模式等这些题目都是我刷到过的并且我也将自己刷的题全部整理成了PDF或者Word文档(含详细答案解析)66个Java面试知识点架构专题(MySQL,Java,Redis,线程,并发,设计模式,Nginx,Linux,框架,微服务等)+大厂面试题详解(百度,阿里,腾讯,华为,迅雷,网易,中兴,北京中软等)算法刷题(PDF)_zkt开发流程详解

乐鑫ESP32-C3项目(4)内置 USB build-in JTAG调试_esp32c3做usb键盘-程序员宅基地

文章浏览阅读3.4k次。1,旧版本的OPENOCD-ESP32有问题,手动升级到最新版本1.1 下载OPENOCD-ESP下载:https://github.com/espressif/openocd-esp32/releases或镜像:https://hub.fastgit.org/espressif/openocd-esp32/releases下载 20211111 及之后的版本都可以Max版本: https://hub.fastgit.org/espressif/openocd-esp32/releases/.._esp32c3做usb键盘

双栈共享_通过双栈共享一个数组空间的实验,帮助同学们灵活运用和掌握栈的知识,同时编写双栈-程序员宅基地

文章浏览阅读362次。双栈共享之数组实现双栈的结构体构建typedef struct SNode{ int *Data; int MaxSize;//栈的总长 int Top1,Top2;//两个栈的栈顶}SNode,*Stack;初始化创建Stack CreateStack( int MaxSize ) { Stack S=(Stack)malloc(sizeof(struct SNode)..._通过双栈共享一个数组空间的实验,帮助同学们灵活运用和掌握栈的知识,同时编写双栈

计算机科学投稿方式,计算机科学投稿模板.doc-程序员宅基地

文章浏览阅读167次。一种基于模板的档案图像压缩新方法杨 有1,2 张小小2 王 伟2,3(重庆师范大学数学与计算机科学学院 重庆 400047)1(重庆大学计算机科学与工程学院,重庆 400044)2重庆 400067)3摘 要 在大容量档案图像数据库中,不仅单页档案图像内部存在数据冗余,而且档案图像页之间存在大量集合冗余。本文提出了基于模板的压缩新方法,通过定义相似图像集合的模板,充分利用图像数据的..._计算机科学投稿格式

2022 年最值得关注的颠覆性技术-程序员宅基地

文章浏览阅读3.1k次,点赞5次,收藏5次。颠覆性技术是一种创新,会导致消费者、企业和行业运营方式发生重大变化。颠覆性技术有可能通过其可衡量和优越的属性来取代现有的系统或习惯。简单来说,颠覆性技术是一种新技术,它显着改变了现有市场或行业的运作方式。颠覆性技术最初往往会遭到现有企业的抵制,因为它们有可能颠覆现状。然而,随着时间的推移,它们可以彻底改变一个行业的运作方式。一些颠覆性技术的例子包括个人电脑、在线购物和拼车应用程序。

Spring基本用法6——整理Spring中的常用注解-程序员宅基地

文章浏览阅读154次。 前言:本文重在整理Spring中的各种注解,简单介绍各注解的使用场景及用法,不做深入探究,可以当做手册查询。1. 概述 启用注配置方式时,配置文件中相关标签的作用:&lt;!-- 启动扫描component功能 --&gt; &lt;context:component-scan base-package="com"/&gt;&lt;!-- ..._请写出6个以上spring常用的注释

推荐文章

热门文章

相关标签