当前位置: 首页 > news >正文

C++线程库的基本使用(初级)

#include<iostream>
#include<thread>
#include<string>
void printHelloWorld(std::string msg)
{std::cout << msg<< std::endl;return;
}
int main()
{std::thread threadl(printHelloWorld,"Hello Thread");//第一个参数是函数名,第二个参数是上一个函数的参数threadl.join();//检查子线程有无return,等子线程结束后,主线程才会继续//threadl.detach();//分离主线程和子线程,主线程和子线程同时进行,主线程运行完之后或子线程结束后释放资源bool isJoin = threadl.joinable();//该函数判断线程能否使用join,detach//join只能使用一次,joinable判断有没有使用过joinreturn 0;
} 
几个需要注意的点:

1.thread参数是引用时:

#include<iostream>
#include<thread>
void foo(int& x)
{x += 1;
}
int main()
{int a = 1;std::thread t(foo, std::ref(a));//使用std::ref()来告诉thread,这个参数是引用t.join();std::cout << a << std::endl;return 0;
} 

2.thread参数是不存在的:

#include<iostream>
#include<thread>
std::thread t;
void foo(int& x)
{x += 1;
}
void test()
{int a = 1;t = std::thread(foo, std::ref(a));
}
int main()
{test();t.join();//a是test函数的局部变量test结束后a已经被释放了//这个线程已经引用不了a了,所以报错return 0;
} 
#include<iostream>
#include<thread>
void foo(int* x)
{std::cout << *x << std::endl;//x现在是野指针
}
int main()
{int* ptr = new int(1);std::thread t(foo, ptr);delete ptr;//此时子线程和主线程同时运行,子线程在运行时,x所指的已经被释放了,子线程运行需要一定的时间t.join();//主线程等待子线程运行结束return 0;
} 

注意:在C++中,std::thread的构造函数要求第一个参数是一个可调用的对象(函数指针、函数名、lambda表达式等),而不是一个类的成员函数。成员函数需要使用类的对象来调用,因此不能直接作为std::thread的参数。(成员函数不是函数名,是因为成员函数是与类对象相关联的函数,它需要一个类的对象来调用。而函数名只是一个标识符,可以与任何类型的函数相关联,包括成员函数和非成员函数。)

#include <iostream>
#include <thread>
class A {
public:void foo(){std::cout << "Hello" << std::endl;}
};
int main() {A a;std::thread t(&A::foo, &a);t.join();return 0;
}

可以用智能指针来防止内存泄漏

#include <iostream>
#include <thread>
class A {
public:void foo(){std::cout << "Hello" << std::endl;}
};
int main() {std::shared_ptr<A> a = std::make_shared<A>();std::thread t(&A::foo, a);t.join();return 0;
}

锁:

#include <iostream>
#include <thread>
#include <mutex>
int a = 0;
std::mutex mtx;
void func()
{for (int i = 0; i < 10000; i++){mtx.lock();a += 1;mtx.unlock();}
}
int main() {std::thread t1(func);std::thread t2(func);t1.join();t2.join();std::cout << a << std::endl;return 0; 
}

相关文章:

C++线程库的基本使用(初级)

#include<iostream> #include<thread> #include<string> void printHelloWorld(std::string msg) {std::cout << msg<< std::endl;return; } int main() {std::thread threadl(printHelloWorld,"Hello Thread");//第一个参数是函数名&…...

2023最新版JavaSE教程——第1天:Java语言概述

目录 一、抽丝剥茧话Java1.1 当前大学生就业形势1.2 IT互联网是否依旧靠谱1.3 IT行业岗位分析1.4 软件开发之Java开发1.5 到底多少人在用Java 二、计算机的硬件与软件2.1 计算机组成&#xff1a;硬件软件2.2 CPU、内存与硬盘2.3 输入设备&#xff1a;键盘输入 三、软件相关介绍…...

PTL货位指引标签为仓储管理打开新思路

PTL货位指引标签是一种新型的仓储管理技术&#xff0c;它通过LED灯光指引和数字显示&#xff0c;为仓库管理带来了全新的管理思路和效率提升&#xff0c;成为现代物流仓库管理中的重要工具。 首先&#xff0c;PTL货位指引标签为仓储管理业务带来了管理新思路。传统的仓库管理中…...

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Maven核心概念

一.Maven的POM POM全称&#xff1a;Project Object Model【项目对象模型】&#xff0c;将项目封装为对象模型&#xff0c;便于使用Maven管理【构建】项目 pom.xml常用标签 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://m…...

Unity的粒子总是丢材质

1&#xff09;Unity的粒子总是丢材质 2&#xff09;C#传给C的Byte数组如何释放 3&#xff09;CommandBuffer.DrawProcedural在手机上为什么不生效 4&#xff09;游戏加载场景碰撞&#xff0c;会弹出显卡报错&#xff0c;驱动程序超时 这是第359篇UWA技术知识分享的推送&#xf…...

P5906 【模板】回滚莫队不删除莫队

这一题&#xff0c;虽说在洛谷标的是模板题&#xff0c;但可能没有“历史研究”那一题更加模板。 这一题相对于回滚莫队的模板题&#xff0c;可能在回滚的处理上稍微复杂了一点。对于回滚莫队就不多解释了&#xff0c;可以看一下 回滚莫队模板题 这一篇博客&#xff0c;稍微简单…...

1. Collection,List, Map, Queue

1. java集合框架体系结构图 2. Collection派生的子接口 其中最重要的子接口是&#xff1a; 1&#xff09;List 表示有序可重复列表&#xff0c;重要的实现类有&#xff1a;ArrayList, LinkedList ArrayList特点&#xff1a;底层数组实现&#xff0c;随机查找快&#xff0c;增删…...

rabbitmq 交换机相关实例代码

1.扇形交换机 定义扇形交换机和队列 package com.macro.mall.portal.config;import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.FanoutExchange; import org.springframework.amqp.…...

第四章IDEA操作Maven

文章目录 创建父工程开启自动导入配置Maven信息创建Java模块工程创建 Web 模块工程 在IDEA中执行Maven命令直接执行手动输入 在IDEA中查看某个模块的依赖信息工程导入来自版本控制系统来自工程目录 模块导入情景重现导入 Java 类型模块 导入 Web 类型模块 创建父工程 开启自动导…...

Go语言函数签名和匿名函数

函数签名 函数类型又叫做函数签名&#xff0c;一个函数的类型就是函数定义首行去掉函数名、参数名和{}&#xff0c;可以用fmt.Printf的“%T”格式化参数打印函数的类型。 两个函数类型相同的条件是&#xff1a;拥有相同的形参列表和返回值列表&#xff0c;形参名可以不同。 ty…...

Pytest系列(16)- 分布式测试插件之pytest-xdist的详细使用

前言 平常我们功能测试用例非常多时&#xff0c;比如有1千条用例&#xff0c;假设每个用例执行需要1分钟&#xff0c;如果单个测试人员执行需要1000分钟才能跑完当项目非常紧急时&#xff0c;会需要协调多个测试资源来把任务分成两部分&#xff0c;于是执行时间缩短一半&#…...

基于JavaWeb的网上销售系统设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…...

wpf添加Halcon的窗口控件报错:下列控件已成功添加到工具箱中,但未在活动设计器中启用

报错截图如下&#xff1a; 注意一下新建工程的时候选择wpf应用而不是wpf应用程序。 添加成功的控件&#xff1a;...

antv/x6 自定义html节点并且支持动态更新节点内容

antv/x6 自定义html节点 效果图定义一个连接桩公共方法注册图形节点创建html节点动态更新节点内容 效果图 定义一个连接桩公共方法 const ports {groups: {top: {position: top,attrs: {circle: {r: 4,magnet: true,stroke: #cf1322,strokeWidth: 1,fill: #fff,style: {visib…...

设计模式之命令模式

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概4000多字&#xff0c;阅读时间长可能需要4-5分钟&#xff0c;请结合示例耐心读完&#xff0c;绝对有收获。设计模式属于程序的设计思…...

Linux学习笔记--高级

Shell概述 1&#xff0c;shell概述 是一个c语言编写的脚本语言&#xff0c;是linux和用户的桥梁&#xff0c;用户输入命令交给shell处理。shell&#xff0c;将相应的操作传递给内核&#xff08;kernel&#xff09;&#xff0c;内核把处理的结果输出给用户 1.1Shell解释器有哪…...

在Java中操作Redis

Redis中如何的去存放一个Java对象&#xff1f; 直接存放Json类型即可&#xff0c;因为我们Json类型最终就是一个String类型。 Redis的Java客户端 Redis的常用命令是我们操作Redis的基础&#xff0c;那么我们在Java程序当中如何来操作Redis呢&#xff1f; 要想基于Java语言…...

【服务器】fiber协程模块

fiber协程模块 以下是从sylar服务器中学的&#xff0c;对其的复习&#xff1b; sylar的fiber协程模块是基于ucontext_t实现非对称协程 函数只有两个行为&#xff1a;调用与返回。一旦函数返回后&#xff0c;它在栈上所拥有的状态将被销毁。协程相比函数多了两个动作&#xf…...

SparkML

SparkML SparkML_lr_train &#xff1a;读取py处理后的train表用于训练&#xff0c;将训练模型保存好。 SparkML_lr_predict &#xff1a;读取训练好的模型&#xff0c;读取py处理后的test表用于预测。将预测结果写入normal_data中&#xff0c;根据id修改stream_is_normal的值。…...

实时定位与路径优化:跑腿App系统开发中的地理信息技术

本文将介绍如何使用地理信息技术实现实时定位和路径优化功能&#xff0c;以提高跑腿服务的效率。 实时定位 用户位置获取 # 示例&#xff1a;获取用户的实时位置 def get_user_location(user_id):# 使用GPS或网络定位技术获取用户的地理坐标# 返回经度和纬度信息return lon…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...