C++ std::thread多线程详解

2023-11-10

(一)、std::thread线程创建

1、函数指针
#include <thread>
#include <iostream>

using namespace std;

void funcThread(int x) 
{
	cout << x << endl;
}

int main() 
{
    std::thread tthread001(funcThread, 100);
    tthread001.join();
    return 0;
}
2、Lambda函数
#include <thread>
#include <iostream>

using namespace std;

int main() 
{
    std::thread tthread001(
    [](int x)
    {
    	cout << x << endl;
    }
    , 100);
    tthread001.join();
    return 0;
}
3、functor (Funciton Object)
#include <thread>
#include <iostream>

using namespace std;

class ST_MSG1
{
public:
    void operator()(int x) 
    {
    	cout << x << endl;
    }
};

int main() 
{
    thread t(ST_MSG1(), 100);
    t.join();
    return 0;
}
4、非静态成员函数
#include <thread>
#include <iostream>

using namespace std;

class ST_MSG1 
{
public:
    void fun(int x)
    {
   		cout << x << endl;
    }
};

int main() 
{
    ST_MSG1 b;
    thread t(&ST_MSG1::fun,&b, 100);
    t.join();
    return 0;
}
5、静态成员函数
#include <thread>
#include <iostream>

using namespace std;

class ST_MSG1
 {
public:
    static void fun(int x)
    {
   		cout << x << endl;
    }
};

int main() 
{
    thread t(&ST_MSG1::fun, 100);
    t.join();
    return 0;
}

(二)、std::thread线程停止

1、join函数
  • join函数,一旦线程开始,我们要想等待线程完成,需要在该对象上调用join()
#include <thread>
#include <iostream>

using namespace std;

int main() 
{
    std::thread tthread001(
    [](int x)
    {
    	cout << x << endl;
    }
    , 100);
    tthread001.join();
    return 0;
}
2、detach函数
  • detach函数是分离线程,分离的线程,主线程对它没有管理权限
#include <thread>
#include <iostream>

using namespace std;

int main() 
{
    std::thread tthread001(
    [](int x)
    {
    	cout << x << endl;
    }
    , 100);
    tthread001.detach();       
    return 0;
}

(三)、std::mutex锁

#include <thread>
#include <iostream>

using namespace std;

int main() 
{
	std::mutex mutTest;
    std::thread tthread001(
    [](int x)
    {
    	// 1、加锁、解锁
    	mutTest.lock();
    	cout << x << endl;
    	mutTest.unlock();
    	// 2、作用域内加锁
    	{
    		lock_guard<mutex> lock(mutTest);      // c++17后可写成 lock_guard lock(mutTest);
    		cout << x << endl;
    	}
    }
    , 100);
    tthread001.detach();
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 行业轮动策略(思想+源码)

    一 行业轮动策略简介 行业轮动是利用市场趋势获利的一种主动量化投资交易策略 其本质是利用不同投资品种强势时间的错位对行业品种进行切换以达到投资收益最大化的目的 通俗点讲就是根据不同行业的区间表现差异 性进行轮动配置 力求能够抓住区间内表现较
  • yarn add报错error: Missing list of packages to add to your project.

    问题描述 运行yarn add命令安装全部依赖项报错 原因 yarn安装全部依赖是 yarn 或者 yarn install 不是yarn add这个命令 yarn add 后面需要跟具体的包名安装某个包 解决 更换成 yarn 或者 ya
  • DDR3详解(以Micron MT41J128M8 1Gb DDR3 SDRAM为例)之一

    1 结构框图 2 管脚功能描述 管脚符号 类型 描述 A0 A9 A10 AP A11 A12 BC A13 Input 地址输入 为ACTIVATE命令提供行地址 和为READ WRITE命令的列地址和自动预充电位 A10 以便从某个ba
  • 基于Selenium模块实现无界面模式 & 执行JS脚本

    此篇文章主要介绍如何使用 Selenium 模块实现 无界面模式 执行JS脚本 把滚动条拉到底部 并以具体的示例进行展示 1 Selenium 设置无界面模式 创建浏览器对象之前 创建 options 功能对象 options webdri
  • Qt 自动单元测试Auto Test Project详解

    Qt 自动单元测试Auto Test Project详解 有时 残缺也是一种美 测试 则意味着需要投入 有些项目的迭代周期很短 如果也搞一个 test 则可能性价比很低 Qt 自动单元测试Auto Test Project详解 官方 htt
  • Eigen矩阵运算库快速上手

    目录 1 配置 2 初始化 2 1 Array类 2 2 Vector类 2 3 Matrix类 2 4 Vector赋值 2 5 高级初始化 3 矩阵计算 3 1 矩阵基本计算 3 2 线性求解 3 3 特征值计算 3 4 奇异值分解 总
  • spring的自动装配三种模式

    第一种装配模式是我们非常熟悉的xml配置 这种装配需要写id class 还有这个类具体的属性值等等 较为麻烦 第二种byName和byType的自动装配模式 如何设置呢 我们有三个类 cat dog people 并且people种有ca
  • MATLAB进阶教程第一节(图形绘制)

    本节是matlab进阶教程的第一节 头一次看的小白请先看完我的matlab入门基础 方便消化 对那些急需图形绘制的朋友将会有很大帮助 一 二维图形的绘制 1 1plot函数 形式 plot X Y S X Y是向量 分别表示点集的横坐标和纵
  • c++基础十四(冒泡排序)

    冒泡排序 基本思路 对于一组要排序的元素列 依次比较相邻的两个数 将比较小的数放在前面 比较大的数放在后面 如此继续 直到比较到最后的两个数 将小数放在前面 大数放在后面 重复步骤 直至全部排序完成 例子 数组Num 5 9 6 7 3 1
  • 常用的MySQL 优化方法

    数据库优化一方面是找出系统的瓶颈 提高MySQL数据库的整体性能 而另一方面需要合理的结构设计和参数调整 以提高用户的相应速度 同时还要尽可能的节约系统资源 以便让系统提供更大的负荷 本文我们来谈谈项目中常用的MySQL优化方法 共19条
  • Bluetooth 蓝牙介绍(三):低功耗蓝牙BLE空口协议Ⅱ

    文章目录 前言 4 5 CONNECTION STATE 4 5 1 Connection events 4 5 2 Supervision timeout 4 5 3 Connection event transmit window 4
  • BurpSuite实现图形验证码识别

    Burp Suite 图形验证码识别 工具 百度ocr识别的使用 打码平台 导入Burp中 工具 Burp Suite Captcha killer burp 验证码识别插件 百度ocr识别 打码平台识别 百度ocr识别的使用 注册百度账号
  • Ajax实现同步

    1 问题 2 解决 1 问题 今天在写分页查询时 因为前端使用的jQuery分页组件 div div
  • how to free up more space in boot partition with Ubuntu16.04

    Your boot partition is full Since this is a kernel update these files will be copied to the boot partition so you need t
  • Hyperledger Fabric学习笔记——3.测试网络的启动分析

    1 启动网络 执行以下指令均要以管理员身份运行 请首先执行su root命令 查看目录 cd home gopath src github com hyperledger fabric samples first network env 存
  • Anaconda安装教程

    Anaconda安装教程 前言 一 Anaconda是什么 二 安装Anaconda步骤 1 下载安装包 安装包下载方法一 安装包下载方法二 建议使用 查看操作系统位数方法 方法一 官网下载安装包 方法二 清华大学开源镜像站下载Anacon
  • window 中 anaconda 下载与安装

    下载 anaconda官网地址 Anaconda Anaconda Distribution 官网打开会看到如下显示 点击download进行下载 或者拉到最下面 选择以往的版本进行下载 windows根据自己电脑选择下载 也可点击下面的a
  • Maven 资源文件(Resources)的打包(package)与过滤(filter)

    资源文件 最常见的 XML Properties 配置文件 比如使用 Mybatis 时的 Mapper Spring 的 ApplicationContext 配置 打包 package 根据 Maven 的默认项目结构 资源文件放置在
  • Android Studio的升级

    一般大家自己电脑都可以自升级 直接在Android Studio中上面导航栏找到check for updates选项点击就行 而如果大家所在公司保密做的比较好 不允许访问外网就只能另想办法了 下面提供两种方案 一 增量更新 增量更新就是在
  • C++ std::thread多线程详解

    c 多线程详解 一 std thread线程创建 1 函数指针 2 Lambda函数 3 functor Funciton Object 4 非静态成员函数 5 静态成员函数 二 std thread线程停止 1 join函数 2 deta