网站开发建设公司电话/东莞市网络seo推广企业

网站开发建设公司电话,东莞市网络seo推广企业,动漫设计与制作都学什么,企业如何做好网站建设C中的std::thread是C11引入的线程库的一部分&#xff0c;提供了创建和管理线程的能力。它封装了操作系统的线程接口&#xff0c;使得在C中更方便地进行多线程编程。 1. std::thread 的定义 std::thread 类位于<thread>头文件中&#xff0c;定义在std命名空间下&#xff…

C++中的std::thread是C++11引入的线程库的一部分,提供了创建和管理线程的能力。它封装了操作系统的线程接口,使得在C++中更方便地进行多线程编程。


1. std::thread 的定义

std::thread 类位于<thread>头文件中,定义在std命名空间下,用于表示一个独立执行的线程对象。其基本声明如下:

#include <thread>

std::thread 可以传递各种类型的参数,但要注意:
默认按值传递,如果要传引用,用 std::ref(x)。
移动对象用 std::move,避免不必要的拷贝。
成员函数必须传对象指针(&obj)。


2. std::thread 的构造函数

std::thread 提供了多个构造函数,允许不同方式创建线程。

(1) 默认构造函数

std::thread();
  • 创建一个空的std::thread对象,不与任何可执行线程关联。
#include <iostream>
#include <thread>int main() {std::thread t;  // 默认构造,不与任何线程关联std::cout << "t is joinable? " << t.joinable() << std::endl; // 输出 0(false)return 0;
}

(2) 可调用对象构造

template< class Function, class... Args >
explicit thread(Function&& f, Args&&... args);
  • 传入一个可调用对象(函数、函数对象、lambda 等)和参数,创建一个新的线程。
#include <iostream>
#include <thread>void func(int x) {std::cout << "Thread function with arg: " << x << std::endl;
}int main() {std::thread t(func, 10); // 创建线程并执行 func(10)t.join();  // 等待线程执行完毕return 0;
}

(3) 移动构造函数

thread(thread&& other) noexcept;
  • std::thread不可拷贝的,但可以移动
  • 该构造函数接收另一个std::thread对象,并接管其线程。
#include <iostream>
#include <thread>void func() {std::cout << "Thread running\n";
}int main() {std::thread t1(func);std::thread t2 = std::move(t1); // t1移动到t2,t1不再管理线程t2.join();return 0;
}

(4) 拷贝构造(删除)

thread(const thread&) = delete;
  • std::thread对象不能被拷贝,因为线程的所有权是唯一的。
  • 这样设计是为了避免多个std::thread对象管理同一个线程,导致未定义行为。
#include <thread>void func() {}int main() {std::thread t1(func);// std::thread t2 = t1; // ❌ 错误,不能拷贝return 0;
}

3. std::thread 的常用成员函数

(1) join() - 等待线程结束

void join();
  • 阻塞调用线程,直到目标线程执行完毕。
  • 必须在可联结的线程上调用,否则会导致异常。
#include <iostream>
#include <thread>void func() {std::cout << "Thread running\n";
}int main() {std::thread t(func);t.join();  // 等待线程执行完毕return 0;
}

(2) detach() - 分离线程

void detach();
  • 让线程在后台运行,与std::thread对象分离。
  • 线程对象会立即销毁,但线程继续执行,执行完毕后自动释放资源。
#include <iostream>
#include <thread>
#include <chrono>void func() {std::this_thread::sleep_for(std::chrono::seconds(2));std::cout << "Thread finished\n";
}int main() {std::thread t(func);t.detach();  // 线程进入后台std::cout << "Main thread continues...\n";std::this_thread::sleep_for(std::chrono::seconds(3)); // 主线程等待return 0;
}

注意:如果主线程退出而分离线程还未执行完,可能会导致未定义行为。因此应谨慎使用detach()


(3) joinable() - 判断线程是否可联结

bool joinable() const noexcept;
  • 如果线程对象管理一个有效线程,则返回true
std::thread t(func);
if (t.joinable()) {t.join();
}

(4) get_id() - 获取线程ID

std::thread::id get_id() const noexcept;
  • 获取线程的唯一ID。
#include <iostream>
#include <thread>void func() {std::cout << "Thread ID: " << std::this_thread::get_id() << std::endl;
}int main() {std::thread t(func);t.join();return 0;
}

(5) native_handle() - 获取操作系统的线程句柄

native_handle_type native_handle();
  • 获取线程的原生句柄,可用于底层线程操作(如设置优先级等)。

(6) hardware_concurrency() - 获取硬件支持的线程数

static unsigned int hardware_concurrency() noexcept;
  • 返回系统建议的并发线程数。
#include <iostream>
#include <thread>int main() {std::cout << "Hardware concurrency: " << std::thread::hardware_concurrency() << std::endl;return 0;
}

4. std::thread 的用法示例

(1) 使用Lambda表达式

#include <iostream>
#include <thread>int main() {std::thread t([] {std::cout << "Lambda thread running\n";});t.join();return 0;
}

(2) 线程数组

#include <iostream>
#include <thread>
#include <vector>void func(int i) {std::cout << "Thread " << i << " started\n";
}int main() {std::vector<std::thread> threads;for (int i = 0; i < 5; ++i) {threads.emplace_back(func, i);}for (auto& t : threads) {t.join();}return 0;
}

总结

  • std::thread 不能拷贝,但可以移动。
  • 使用join()等待线程结束,使用detach()分离线程。
  • 使用joinable()检查线程是否可联结。
  • 使用get_id()获取线程ID。
  • hardware_concurrency()获取系统支持的线程数。

多线程编程需要注意数据同步,否则可能导致数据竞争(race condition)等问题。可以使用std::mutexstd::condition_variable等同步机制来解决这些问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/73913.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【css酷炫效果】纯CSS实现故障文字特效

【css酷炫效果】纯CSS实现故障文字特效 缘创作背景html结构css样式完整代码基础版进阶版(3D效果) 效果图 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;https://download.csdn.net/download/u011561335/90492053 缘 创作随缘&#xff0c;不定时更新。 创作背景 刚…

uniapp配置代理解决跨域问题

两种方式&#xff1a; 1、manifest.json中配置 "h5" : {"template" : "static/index.html","devServer" : {"port" : 9090,"https" : false,"proxy":{"/prod-api":{"target":&quo…

物联网为什么用MQTT不用 HTTP 或 UDP?

先来两个代码对比&#xff0c;上传温度数据给服务器。 MQTT代码示例 // MQTT 客户端连接到 MQTT 服务器 mqttClient.connect("mqtt://broker.server.com:8883", clientId) // 订阅特定主题 mqttClient.subscribe("sensor/data", qos1) // …

Flutter:页面滚动,导航栏背景颜色过渡动画

记录&#xff1a;导航默认透明&#xff0c;页面发生滚动后&#xff0c;导航背景色由0-1&#xff0c;过渡到白色背景。 view import package:ducafe_ui_core/ducafe_ui_core.dart; import package:flutter/material.dart; import package:get/get.dart; import package:redo…

批量删除 PPT 空白幻灯片页面

如果我们需要删除 PPT 文档中的空白幻灯片页面&#xff0c;我们可以借助 Office 工具来完成&#xff0c;但是如果是大量的 PPT 文档需要批量删除空白幻灯片页面&#xff0c;那就需要使用专业的批量处理工具来完成&#xff0c;今天就给大家介绍一种批量删除 PPT 空白幻灯片页面的…

【canvas】一键自动布局:如何让流程图节点自动找到最佳位置

一键自动布局&#xff1a;如何让流程图节点自动找到最佳位置 引言 在流程图、拓扑图和系统架构图设计中&#xff0c;节点布局往往是最令人头疼的问题。如果手动调整每个节点位置&#xff0c;不仅耗时费力&#xff0c;还难以保证美观性和一致性。本文将深入解析如何实现自动布…

【平台优化】大数据集群一个客户端参数引起的任务性能差的问题

大数据集群一个客户端参数引起的任务性能差的问题 背景介绍排查过程任务慢的具体原因Executor中数据内存往磁盘溢写结果数据写入分区路径 分析解决方案 结语&思考 背景介绍 随着业务量不断扩大&#xff0c;平台逐步发展成HDFS多联邦的架构&#xff0c;这个过程中&#xff…

uniapp常用组件

写在前面 今天将uniapp中的组件都过了一遍&#xff0c;上手难度不大&#xff0c;但是还是遇到了一些问题&#xff1a; HBuilder实在是太难用&#xff0c;不管是插件生态还是设计之类的&#xff0c;总之就是用的哪哪不顺手虽然打开内置浏览器是挺方便的&#xff0c;但是不知道…

【Linux】应用层自定义协议 + 序列化和反序列化

应用层自定义协议 序列化和反序列化 一.应用层1.再谈 "协议"2.序列化 和 反序列化 二. Jsoncpp1.序列化2.反序列化 三. Tcp全双工 面向字节流四.自定义协议 保证报文的完整性1.Makefile2.Mutex.hpp3.Cond.hpp4.Log.hpp5.Thread.hpp6.ThreadPool.hpp7.Common.hpp8.…

麒麟V10 arm cpu aarch64 下编译 RocketMQ-Client-CPP 2.2.0

国产自主可控服务器需要访问RocketMQ消息队列&#xff0c;最新的CSDK是2020年发布的 rocketmq-client-cpp-2.2.0 这个版本支持TLS模式。 用默认的版本安装遇到一些问题&#xff0c;记录一下。 下载Releases apache/rocketmq-client-cpp GitHubhttps://github.com/apache/roc…

C语言每日一练——day_12(最后一天)

引言 针对初学者&#xff0c;每日练习几个题&#xff0c;快速上手C语言。第十二天。&#xff08;最后一天&#xff0c;完结散花啦&#xff09; 采用在线OJ的形式 什么是在线OJ&#xff1f; 在线判题系统&#xff08;英语&#xff1a;Online Judge&#xff0c;缩写OJ&#xff0…

网络安全应急入门到实战

奇安信&#xff1a;95015网络安全应急响应分析报告&#xff08;2022-2024年&#xff09;官网可以下载 https://github.com/Bypass007/Emergency-Response-Notes 应急响应实战笔记 网络安全应急响应技术实战指南 .pdf 常见场景 第4章 勒索病毒网络安全应急响应 第5章 挖矿木…

Visual Studio里的调试(debugging)功能介绍

参考 1- Introduction to Debugging | Basic Visual Studio Debugging&#xff08;这是一位印度博主视频&#xff0c;我下面做到笔记也主要参考她的视频&#xff0c;但不得不说口音太重了&#xff0c;一股咖喱味&#xff09; 目录 个人对调试浅显的认识和对调试的介绍逐行调…

基于FPGA的3U机箱模拟量高速采样板ADI板卡,应用于轨道交通/电力储能等

板卡简介&#xff1a; 本板为模拟量高速采样板&#xff08;ADI&#xff09;&#xff0c;主要用于电机转速和相电流检测&#xff0c;以实现电机闭环控制。 性能规格&#xff1a; 电源&#xff1a;DC5V&#xff0c;DC3.3V&#xff0c;DC15V&#xff0c;DC24V FPGA&#xff1a;…

Gymnasium Cart Pole 环境与 REINFORCE 算法 —— 强化学习入门 2

Title: Gymnasium Cart Pole 环境与 REINFORCE 算法 —— 强化学习入门 2 文章目录 I. Gymnasium Cart Pole 环境II. REINFORCE 算法1. 原理说明2. REINFORCE 算法实现 I. Gymnasium Cart Pole 环境 Gymnasium Cart Pole 环境是一个倒立摆的动力学仿真环境. 状态空间: 0: Ca…

RBA+minibatch的尝试

目录 还是咬着牙来写 RBA了 JAX JAX->TORCH torch tensor的变形 pytorch怎么把一个【3,3,5】的tensor变成【3,10,5】&#xff0c;多的用0填充 pytorch如何把shape【100】转成【100,1】 把torch shape【100,1】变成【100】 SQUEEZE grad_fn 不能两次反向传播 还…

基于Python+Django的二手房信息管理系统

项目介绍 PythonDjango二手房信息管理系统(Pycharm Django Vue Mysql) 平台采用B/S结构&#xff0c;后端采用主流的Python语言进行开发&#xff0c;前端采用主流的Vue.js进行开发。 整个平台包括前台和后台两个部分。 - 前台功能包括&#xff1a;首页、二手房信息、公告管理、…

爬虫基础之爬取猫眼Top100 可视化

网站: TOP100榜 - 猫眼电影 - 一网打尽好电影 本次案例所需用到的模块 requests (发送HTTP请求) pandas(数据处理和分析 保存数据) parsel(解析HTML数据) pyecharts(数据可视化图表) pymysql(连接和操作MySQL数据库) lxml(数据解析模块) 确定爬取的内容: 电影名称 电影主演…

Hadoop 启动,发现 namenode、secondary namenodes,这两个没有启动,报错超时。

今天在启动 hadoop 的时候&#xff0c;发现本应该同时启动的 namenode、secondary namenodes 却都没有启动。我还以为是坏了又重新装了虚拟机&#xff0c;重新下载 Hadoop 重新配置结果还是同样的问题&#xff0c;那没办法只能去解决问题了。 首先先再次尝试启动看他报错是什么…

Ranger 鉴权

Apache Ranger 是一个用来在 Hadoop 平台上进行监控&#xff0c;启用服务&#xff0c;以及全方位数据安全访问管理的安全框架。 使用 ranger 后&#xff0c;会通过在 Ranger 侧配置权限代替在 Doris 中执行 Grant 语句授权。 Ranger 的安装和配置见下文&#xff1a;安装和配置 …