C++多线程之std::thread

2023-10-31

C++11,包含头文件 thread.h,并使用命名空间std。

thread类提供的方法

方法 描述
thread 构造函数,在这里传入线程执行函数,和函数参数
get_id 返回std::thread::id,这是一个类,可以间接得到unsigned型线程id
joinable 线程执行函数是否还没有退出
join 阻塞,直到线程退出
detach 分离线程,thread类放弃对线程执行函数的控制
swap 交换线程
native_handle 获取线程句柄
hardware_concurrency [static] 检查线程并发特性

thread::id转unsigned型id

thread::id是一个类,可以F12查看它的源码。
参考代码

unsigned ThreadC11::getId()
{
	stringstream buf;
	m_thread->get_id()._To_text(buf);

	unsigned id = 0;
	buf >> id;
	
	return id;
}

再封装thread

虽然C++11的thread已经很完美了,但要实现实用线程(执行函数无限循环并自然退出),还是有点欠缺。
也可下载完整测试代码

.h

#pragma once

typedef void(*proc_type)(void*);

namespace std {
	class thread;
}

class ThreadC11
{
public:
	ThreadC11(proc_type proc, void* param);
	~ThreadC11();

	friend void threadC11Pro(void* param);

	//返回线程ID
	unsigned getId();

private:
	//结束
	bool stop();
	//禁止拷贝
	ThreadC11(const ThreadC11 &) = delete;
	//禁止赋值
	ThreadC11& operator=(const ThreadC11 &) = delete;

private:
	proc_type	m_proc;		//线程执行函数
	void*		m_param;	//执行函数参数
	bool		m_alive;	//线程是否活着
	std::thread*	m_thread;	//线程对象
};

.cpp

添加了打印线程ID的测试代码,可适当剔除

#include "ThreadC11.h"
#include <thread>
#include <sstream>
#include <iostream>
#include <windows.h>
using namespace std;

static void threadC11Pro(void* param)
{
	cout << "thread real id: " << GetCurrentThreadId() << endl;
	ThreadC11* th = (ThreadC11*)param;
	
	while (th->m_alive)
	{
		th->m_proc(th->m_param);
	}
}

ThreadC11::ThreadC11(proc_type proc, void* param)
	: m_proc(proc)
	, m_param(param)
	, m_alive(true)
{
	m_thread = new thread(threadC11Pro, this);
}

ThreadC11::~ThreadC11()
{
	stop();
	delete m_thread;
}

unsigned ThreadC11::getId()
{
	stringstream buf;
	m_thread->get_id()._To_text(buf);

	unsigned id;
	buf >> id;

	cout << "thread may id: " << id << endl;
	return id;
}

bool ThreadC11::stop()
{
	m_alive = false;
	if (m_thread->joinable())
	{
		m_thread->join();
	}

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

C++多线程之std::thread 的相关文章

随机推荐

  • vue通过el-upload组件上传文件到服务器使用总结

    vue通过el upload组件上传文件到服务器使用总结 1 业务需求 vue项目需要通过elementUI的el upload组件上传文件 但是一般情况下请求接口是需要携带token值的 如果不携带则上传不成功 而el upload是通过
  • python为什么叫爬虫?Python和爬虫有什么关系?

    提到Python有同学自然就想到爬虫 但实际上Python和爬虫并不是一个概念的东西哦 下面小千就来给大家介绍一下 爬虫 爬虫又称网络爬虫 又称为网页蜘蛛 网络机器人 在FOAF社区中间 经常的称为网页追逐者 是一种按照一定的规则 自动地抓
  • 【单目标优化算法】沙猫群优化算法(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 本研究提出了一种新的元启发式算法 称为沙猫
  • mysql第三次上机

    Mysql第三次上机 上机3 1 基于第一次上机创建的银行数据库 创建一个函数 为所有存款账户增加1 的利息 2 创建一个新表branch total 用于存储各个支行的存款总额 表中有branch name和total balance两个
  • 【深入理解Java虚拟机】内存管理和对象访问

    一 JVM内存区域划分 1 程序计数器 线程私有 类似于eclipse中断点程序 行号指示器 记录了程序下一步需要执行的字节码指令 分支 循环等分支 线程私有 每个线程有一个程序计数器 程序计数器是为了多线程情况下 线程执行切换后 处理器回
  • 7大嵌入式开发技巧,你知道吗?

    成为一个正式的工程师 它是一个艰辛的过程 需要开发人员维护和管理系统的每个比特和字节 从规范完善的开发周期到严格执行和系统检查 开发高可靠性嵌入式系统的技术有许多种 今天给大家介绍7个易操作且可以长久使用的技巧 它们对于确保系统更加可靠地运
  • ‘执行力’

    执行力 执行力是一种能力 更是一种态度 很多时候 因为犹豫不决 导致很多不应该发生的事情发生了 从今天起 锻炼自己的执行能力 从生活中的的小事开始 起床铃声响起 不赖床 想到什么就去实践 结果如何那都是后话 如果都不去做 何来的结果
  • [C4W4] Convolutional Neural Networks - Special applications: Face recognition & Neural style transfe...

    第四周 Special applications Face recognition Neural style transfer 什么是人脸识别 What is face recognition 欢迎来到第四周 即这门课卷积神经网络课程的最后
  • javascript 获取 全部cookie(以对象形式返回)

    javascript 获取 cookie 以对象形式返回 建议定义全局变量cookie if document cookie var cookie eval document cookie replaceAll replaceAll els
  • linux vmstat io,Linux下vmstat调优工具的深入分析 (*****)

    vmstat procs memory swap io system cpu r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 310596 24796 1437
  • mybatis概述及搭建

    目录 1 概述 2 mybatis搭建 1 创建一个maven项目 添加mybatis mysql所依赖的jar 2 创建一个数据库表 及对应的java类 3 创建一个mybatis的核心配置文件 配置数据库连接信息 配置sql映射文件 4
  • 【Unity-Cinemachine相机】相机跟随之Transposer属性

    相机跟随和瞄准行为 Transposer 虚拟相机将在某个固定的偏移或距离上跟随目标移动 上面的偏移量就是Follow Offset Binding Mode决定Follow Offset是目标本地坐标系下的身后十米还是世界坐标系下的身后十
  • apache druid学习之Processes and servers

    Processes and servers Apache Druid Process types Druid has several process types Coordinator Overlord Broker Historical
  • 获取代理服务器ip列表的方法

    开源项目 https github com SpiderClub haipproxy 看爬代理的网址列表应该是最多的 CRAWLER TASKS name mogumiao com resource http www mogumiao co
  • MongoDB下载安装教程

    MongoDB下载安装教程 1 下载 2 安装 3 启动mongoDB 3 1 在windows的任务管理器中启动mongoDB 3 2 双击mongo exe 启动mongodb 3 3 在此处输入命令 操作数据库 4 操作mongoDB
  • linux经典面试问题

    你在准备 Linux 面试吗 我们准备了一些常见的 Linux 面试问题及其答案 如果您是初学者 具有一定的 Linux 知识或获得认证 或具有专业的 Linux 管理经验 那么下面的问答有助于您准备面试 1 什么是Linux及基本组件 L
  • java.net.UnknownServiceException: CLEARTEXT communication to www.httpbin.org not permitted by networ

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 在Android9 0系统的手机上访问http的api 出现以下异常 java net UnknownServiceException
  • 理解RoIAlign实际操作

    我们的模型取一个大小为 512x512x3 宽度x高度x RGB 的图像输入 VGG16将其映射为一个 16x16x512的feature map 比例因子是 32 接下来 我们将使用其中一个proposed RoIs 145x200box
  • C++构造函数/析构函数 设置成private的原因

    将构造函数 析构函数声明为私有和保护的 那么对象如何创建 已经不能从外部调用构造函数了 但是对象必须被构造 应该如何解决 麻烦大家帮忙说明 关于构造 析构函数声明为私有和保护时的用法 提出这个问题 说明你已经对c 有所思考了 从语法上来讲
  • C++多线程之std::thread

    C 11 包含头文件 thread h 并使用命名空间std thread类提供的方法 方法 描述 thread 构造函数 在这里传入线程执行函数 和函数参数 get id 返回std thread id 这是一个类 可以间接得到unsig