C++多线程:创建线程

2023-11-18

     C++中线程的创建一般是通过std::thread类实现的,具体的实现方式有以下几种:

1 使用函数名创建

void pcreat(int a) 
{
	cout << "start !" << a << endl;
}

int main()
{
	thread p(pcreat,4);  //如果函数无参则省略第二个参数,多参数直接加在后面即可
	p.join();
    return 0;
}

2 使用类对象创建

class X
{
public:
	X() { cout << "constructor!" << endl; }
	X(const X & m) { cout << "copy constructor called !" << endl; }
	void operator()(int a)   // 重载括号运算符。如果无参则为void operator()(){...}
	{
		cout << "start!" <<a<< endl;
	}
};

int main()
{
	X a;
	thread p(a,4);  //以对象a创建线程,并传递参数4,无参的话直接省略第二个参数,更多的参数直接加在后面
	p.join();
    return 0;
}

      实现这种方式的重点是重载了括号运算符。还需要注意的是,这里调用了一次拷贝构造函数,这是因为用对象来创建线程时,会自动拷贝该对象到子线程中。

3 使用lambda创建

int main()
{
	auto f = [](int a, int b){ 
              cout << "lambda pthread creat" << endl; 
              cout << a << " " << b << endl; };

	thread p(f,3,4);
	p.join();

    return 0;
}

4 使用成员函数创建

       这里有两种方法通过成员函数创建。而这两种方法恰好也就是静态成员函数和非静态成员函数的区别。静态成员函数与对象无关,只属于类本身,因此在创建线程时只需要给出静态成员函数地址即可;而非静态成员函数是属于对象的,只有在对象创建后才能够调用,因此在创建线程时必须还要传递对象的地址。

      通过静态成员函数创建线程:

class A
{
public:

   static void fun(int a)
	{
		cout << a << endl;
		return;
	}

};
int main()
{
	int x = 5;

	thread p(&A::fun,x);

	p.join();

    return 0;
}

     非静态成员函数创建线程:

class A
{
public:
    void fun(int a)
	{
		cout << a << endl;
		return;
	}

};
int main()
{
	int x = 5;

	A a;

	thread p(&A::fun,&a,x); //必须传入对象的地址,即this指针,才能找到线程函数的地址

	p.join();

    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++多线程:创建线程 的相关文章

  • 基于UDP编程

    基于UDP编程 1 UDP是数据报协议 无连接的 不可靠 追求传输效率的一种通信协议数据的发送和接收是同步的 在进行通信之前 不需要建立连接 其传输效率比TCP高 对其服务器而言 并没有三次握手的过程 因此和TCP相比 少了被动监听 lis

随机推荐

  • Springboot实现发送邮件功能

    相信使用过Spring的众多开发者都知道Spring提供了非常好用的JavaMailSender接口实现邮件发送 在Spring Boot的Starter模块中也为此提供了自动化配置 下面通过实例来讲解如何在Spring Boot中使用Ja
  • 发布自己的Python包(Pypi)

    发布自己的Python包 Pypi 我们经常使用 Pypi 来安装包 但是有时候我们也想要发布自己的 Pypi 包 有可能我们写了一个特别牛的包 也有可能我们只是想使用自己常用的一些轮子 可能这是我们日常编码中很常用的一些轮子 我们在不同工
  • AttributeError: 'list' object has no attribute 'shape'

    深思熟虑 运筹帷幄 疑惑 解惑 shape 是数组的属性 不是集合的属性 可把集合变成数组 如np array list A
  • 架构之道:分离业务逻辑和技术细节

    点击上方 朱小厮的博客 选择 设为星标 当当满200减40优惠码 J2KNAE 来源 阿里巴巴云原生 1 什么是架构 关于架构这个概念很难给出一个明确的定义 也没有一个标准的定义 硬是要给一个概述 我认为架构就是对系统中的实体以及实体之间的
  • [深度学习] - 网络模型训练过程的 loss 变化分析 (loss / val_loss / test_loss)

    目录 一 train set 和 test set 基础知识 二 分析 loss 和 val loss test loss 变化情况 一 train set 和 test set 基础知识 train set 训练集是用来训练网络模型的数据
  • 大数据主要应用于哪些行业,应用价值是什么?

    大数据无处不在 大数据应用于各个行业 包括金融 汽车 餐饮 电信 能源 体能和娱乐等在内的社会各行各业都已经融入了大数据的印迹 下面详细介绍一下大数据在各行各业的具体应用 制造业 利用工业大数据提升制造业水平 包括产品故障诊断与预测 分析工
  • - UnitBox An Advanced Object Detection Network,arxiv 16.08

    UnitBox An Advanced Object Detection Network arxiv 16 08 download 该论文提出了一种新的loss function IoU loss 这点比较有意思 也容易复现 论文分析了fa
  • Python之子类调用父类的两种方式

    第一种方式 直接在子类中调用父类名 调用方式如下 Vehicle init self name speed load power 调用父类的实例 Vehicle run self 调用父类的方法 下面给出具体样例 直接调用父类名 class
  • Tesseract-OCR4.0在Visual Studio2015中的编译及运行

    最近项目需要使用到OCR引擎 通过百度了解到Tesseract在这方面做的挺好的 于是便开始学习tesseract tesseract的github地址 https github com tesseract ocr tesseract 现在
  • 四种排序:选择,插入,冒泡,快速排序原理及其对应的时间、空间复杂度解析

    四种排序 选择 插入 冒泡 快速排序原理及其对应的时间空间复杂度 首先 在了解四种排序之前 让我们来了解一下什么是时间复杂度和空间复杂度 时间复杂度 算法的时间复杂度是一个函数 它定性描述该算法的运行时间 记做T n 直白的来说 就是指运行
  • SDIO 驱动

    原文地址 http blog csdn net fengyuyaoye1980 article details 6859343 SDIO卡 SDIO卡是在SD内存卡接口的基础上发展起来的接口 SDIO接口兼容以前的SD内存卡 并且可以连接S
  • 期货开户的时间和流程

    对于一些想要做期货投资的朋友来说 最基本的就是首先要进行期货开户 那就需要了解开户具体的流程和相关注意事项 一般来说了解清楚一下三点就没什么问题了 一 对开户者本人的要求 1 年满18周岁 2 中国公民 有中国公民身份证 境内储蓄卡 3 没
  • pywinauto和PyUserInput实现windows程序自动化

    一 pywinauto 官方文档 https pywinauto readthedocs io en latest code code html 首先需要下个spy lite 便于查看程序窗口属性 主要模块 pywinauto applic
  • 通过jdbc实现GBase 8s Row类型数据插入与查询

    Row数据类型 由一个或多个任意的数据类型组成 例如 创建一个r1 t的Row数据类型 具有integer类型的i和boolean类型的b字段 参考语句如下 CREATE ROW TYPE r1 t i int b boolean 本文章详
  • Flutter:bottomNavigationBar图标白色的解决办法

    Flutter中 如果底部的Item超过三个 我们就需要为BottomNavigationBar设置一个type属性为 BottomNavigationBarType fixed 否则图标就会变成白色 导致什么都看不见
  • 设计模式之【观察者模式】

    观察者模式动机与定义 模式动机 一个对象的状态改变会引起其他对象的状态改变 模式定义 观察者模式 Observer Pattern 定义 定义对象间一种一对多的依赖关系 使得每当一个对象状态发生改变时 其相关依赖对象皆得到通知并被自动更新
  • few-shot learning, zero-shot learning, one-shot learning,any-shot learning, C-way K-shot,Meta-learn

    更新 2021 7 6 元学习 meta learning 与机器学习 machine learning machie learning 通常是单任务学习 每个任务有训练集和测试集 在训练集上训练模型 在测试集上测试模型 meta lear
  • 年底裸辞准备面试,我用7张图画了ZK分布式锁!

    一 写在前面 之前写过一篇文章 都2022年了 出去面试连分布式锁的源码你都不会画 给大家说了一下Redisson这个开源框架是如何实现Redis分布式锁原理的 这篇文章再给大家聊一下ZooKeeper实现分布式锁的原理 同理 我是直接基于
  • Python opencv学习-12 2D直方图绘制

    绘制2D直方图 要转换到hsv色彩空间 import cv2 import numpy as np from matplotlib import pyplot as plt img cv2 imread image pic2 png hsv
  • C++多线程:创建线程

    C 中线程的创建一般是通过std thread类实现的 具体的实现方式有以下几种 1 使用函数名创建 void pcreat int a cout lt lt start lt lt a lt lt endl int main thread