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

C++:pthread线程分离和线程属性

在 C++ 的多线程编程中,pthread 库提供了强大的功能来管理线程。其中,线程分离和线程属性是两个重要的概念,它们对于优化线程的行为和资源管理有着关键作用。

线程分离

1.1 什么是线程分离

在 pthread 库中,线程有两种状态:可结合(joinable)和分离(detached)。默认情况下,新创建的线程是可结合的。可结合的线程在结束时,需要其他线程调用pthread_join函数来回收其资源,否则会造成资源泄漏。而分离的线程则会在结束时自动释放资源,无需其他线程来回收。

1.2 为什么要使用线程分离

在某些场景下,我们创建的线程执行完任务后,不需要获取其返回值,也不需要关心它的结束状态,此时将线程设置为分离状态可以避免资源浪费和不必要的同步开销。例如,在一个服务器程序中,为每个客户端连接创建一个线程来处理请求,这些线程处理完请求后就可以自动释放资源,不需要主线程逐个等待它们结束。

1.3 如何实现线程分离

在 pthread 库中,可以使用pthread_detach函数来将一个线程设置为分离状态。该函数的原型如下:

int pthread_detach(pthread_t thread);

thread是要设置为分离状态的线程标识符。
以下是一个简单的 C++ 代码示例,展示了如何创建一个分离的线程:

#include <iostream>
#include <pthread.h>
#include <unistd.h>// 线程函数
void* thread_function(void* arg) {sleep(2);std::cout << "This is a detached thread." << std::endl;return nullptr;
}int main() {pthread_t thread;// 创建线程if (pthread_create(&thread, nullptr, thread_function, nullptr)!= 0) {std::cerr << "Failed to create thread" << std::endl;return 1;}// 将线程设置为分离状态if (pthread_detach(thread)!= 0) {std::cerr << "Failed to detach thread" << std::endl;return 1;}std::cout << "Detached thread created successfully." << std::endl;// 主线程继续执行其他任务sleep(3);return 0;
}

创建了一个线程,并使用pthread_detach将其设置为分离状态。主线程在创建和分离线程后,继续执行其他任务,而分离的线程在完成任务后会自动释放资源,其他线程不能再使用 pthread_join 来等待它结束。
pthread_detach 可以在主函数调用,也可以在thread_function函数调用

#include <iostream>
#include <pthread.h>
#include <unistd.h>
using namespace std;
int j = 2;
void* pthread_fun(void *arg)
{//自己设置为detached状态int ret = pthread_detach(pthread_self());while(j--){cout << " in pthread_task" << endl;cout << *(int*)arg << endl;sleep(1);}// 线程返回一个整数值int* result = new int(42);return static_cast<void*>(result);//pthread_exit(reinterpret_cast<void*>(result));}int main()
{int ret = 0;pthread_t tid = 0;int argsend = 99;int i = 3;ret  = pthread_create(&tid, NULL, pthread_fun, &argsend);if(ret != 0){cout << " pthread_create error" << endl;return -1;}while(i--){cout << "pthread _create success" << endl;sleep(2);}return 0;
}

线程属性

2.1 线程属性概述

线程属性定义了线程的一些特性,如栈大小、调度策略、优先级等。通过设置线程属性,可以根据具体的应用需求来优化线程的行为。在 pthread 库中,使用pthread_attr_t类型来表示线程属性。

2.2 常见的线程属性

栈大小:线程的栈用于存储局部变量、函数调用信息等。可以通过pthread_attr_setstacksize函数来设置线程的栈大小。

pthread_attr_t attr;
pthread_attr_init(&attr);
size_t stack_size = 1024 * 1024; // 1MB栈大小
pthread_attr_setstacksize(&attr, stack_size);

调度策略:pthread 库支持多种调度策略,如 SCHED_OTHER(普通调度策略)、SCHED_FIFO(先进先出调度策略)、SCHED_RR(时间片轮转调度策略)。可以使用pthread_attr_setschedpolicy函数来设置调度策略。

pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setschedpolicy(&attr, SCHED_RR);

优先级:线程的优先级决定了它在 CPU 竞争中的优先级。可以通过pthread_attr_setschedparam函数来设置线程的优先级。

pthread_attr_t attr;
pthread_attr_init(&attr);
struct sched_param param;
param.sched_priority = 50; // 设置优先级
pthread_attr_setschedparam(&attr, &param);

2.3 使用线程属性创建线程

在创建线程时,可以将设置好的线程属性作为参数传递给pthread_create函数。

#include <iostream>
#include <pthread.h>
#include <unistd.h>// 线程函数
void* thread_function(void* arg) {std::cout << "Thread is running." << std::endl;return nullptr;
}int main() {pthread_t thread;pthread_attr_t attr;// 初始化线程属性pthread_attr_init(&attr);// 设置栈大小为2MBsize_t stack_size = 2 * 1024 * 1024;pthread_attr_setstacksize(&attr, stack_size);// 设置调度策略为时间片轮转pthread_attr_setschedpolicy(&attr, SCHED_RR);// 设置优先级struct sched_param param;param.sched_priority = 50;pthread_attr_setschedparam(&attr, &param);// 使用设置好的属性创建线程if (pthread_create(&thread, &attr, thread_function, nullptr)!= 0) {std::cerr << "Failed to create thread" << std::endl;return 1;}// 等待线程结束if (pthread_join(thread, nullptr)!= 0) {std::cerr << "Failed to join thread" << std::endl;return 1;}// 销毁线程属性pthread_attr_destroy(&attr);return 0;
}

首先初始化了线程属性,然后设置了栈大小、调度策略和优先级,最后使用这些属性创建了一个线程

#include <iostream>
#include <pthread.h>
#include <unistd.h>
using namespace std;
int j = 2;
void* pthread_fun(void *arg)
{//自己设置为detached状态//int ret = pthread_detach(pthread_self());while(j--){cout << " in pthread_task" << endl;cout << *(int*)arg << endl;sleep(1);}// 线程返回一个整数值int* result = new int(42);return static_cast<void*>(result);//pthread_exit(reinterpret_cast<void*>(result));}int main()
{int ret = 0;pthread_t tid = 0;int argsend = 99;int i = 3;pthread_attr_t attr;// 初始化线程属性pthread_attr_init(&attr);ret  = pthread_create(&tid, NULL, pthread_fun, &argsend);if(ret != 0){cout << " pthread_create error" << endl;return -1;}sched_param param;// 获取线程属性中的调度参数if (pthread_attr_getschedparam(&attr, &param) != 0) {std::cerr << "Failed to get scheduling parameters." << std::endl;return 1;}// 打印调度参数中的优先级std::cout << "Scheduling priority: " << param.sched_priority << std::endl;// 设置线程属性的分离状态为分离ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);if (ret != 0) {cerr << "Failed to set detach state." << endl;return -1;}while(i--){cout << "pthread _create success" << endl;sleep(2);}int detachstate;// 获取线程属性的分离状态if (pthread_attr_getdetachstate(&attr, &detachstate) != 0) {std::cerr << "Failed to get detach state." << std::endl;// 销毁线程属性对象pthread_attr_destroy(&attr);return 1;}// 根据分离状态输出相应信息if (detachstate == PTHREAD_CREATE_JOINABLE) {std::cout << "Thread is joinable." << std::endl;} else if (detachstate == PTHREAD_CREATE_DETACHED) {std::cout << "Thread is detached." << std::endl;} else {std::cout << "Unknown detach state." << std::endl;}// 销毁线程属性pthread_attr_destroy(&attr);return 0;
}

pthread_attr_getdetachstate(&attr, &detachstate) 用于获取线程属性对象 attr 中设置的分离状态。它查询的是线程属性对象的配置信息,而不是pthread_detach线程实际运行时的分离状态。

线程分离和线程属性是 pthread 库中非常实用的功能。通过合理使用线程分离,可以避免资源浪费和同步开销;而灵活设置线程属性,则可以根据应用需求优化线程的行为。

相关文章:

C++:pthread线程分离和线程属性

在 C 的多线程编程中&#xff0c;pthread 库提供了强大的功能来管理线程。其中&#xff0c;线程分离和线程属性是两个重要的概念&#xff0c;它们对于优化线程的行为和资源管理有着关键作用。 线程分离 1.1 什么是线程分离 在 pthread 库中&#xff0c;线程有两种状态&#…...

Orange 开源项目 - 集成阿里云大模型

1 阿里云的大模型服务平台百炼 阿里云的大模型服务平台百炼是一站式的大模型开发及应用构建平台。不论是开发者还是业务人员&#xff0c;都能深入参与大模型应用的设计和构建。您可以通过简单的界面操作&#xff0c;在5分钟内开发出一款大模型应用&#xff0c;或在几小时内训练…...

Docker 搭建 MySQL 数据库

Docker 搭建 MySQL 数据库 前言一、准备工作二、设置 MySQL 容器的目录结构三、配置 MySQL 容器四、自定义 MySQL 配置五、端口配置&#xff1a;Host 网络模式 vs Port 映射模式六、检查 MySQL 容器状态七、连接到 MySQL 容器八、备份与恢复总结 前言 在本篇文章中&#xff0c…...

使用 Docker 部署 Flask 应用

使用 Docker 部署 Flask 应用 一、引言 在现代软件开发中,应用的部署和环境管理是至关重要的环节。传统的部署方式常常会遇到 “在我机器上能运行,在你机器上不行” 的问题,而 Docker 的出现很好地解决了这个痛点。Docker 是一个用于开发、部署和运行应用程序的开放平台,…...

公开整理-最新中国城市统计NJExcel+PDF版本(1985-2024年)

数据简介&#xff1a;《中国城市统计NJ》从1985年开始&#xff0c;本NJ内容共分四个部分:第一部分是全国城市行政区划,列有不同区域、不同级别的城市分布情况;第二、三部分分别是地级以上城市统计资料和县级城市统计资料,具体包括人口、劳动力及土地资源、综合经济、工业、交通…...

python绘图之swarmplot分布散点图

swarmplot 是 Seaborn 提供的一种用于展示分类数据分布的散点图。它的主要作用是将数据点按照分类变量&#xff08;通常是离散变量&#xff09;进行分组&#xff0c;并在每个分类中以一种非重叠的方式展示数据点的位置。这种可视化方式可以帮助我们直观地理解数据在不同分类下的…...

KubeSphere平台安装

KubeSphere简介 KubeSphere 是一款功能强大的容器管理平台&#xff0c;以下是其简介&#xff1a; 1&#xff09;基本信息 开源项目&#xff1a;基于 Apache-2.0 授权协议开源&#xff0c;由 Google Go、Groovy、HTML/CSS 和 Shell 等多种编程语言开发。基础架构&#xff1a;…...

Claude 3.7 Sonnet 泄露,Anthropic 最先进 AI 模型即将在 AWS Bedrock 上首次亮相

(图片&#xff1a;AWS) Anthropic 旗下先进的 AI 模型 Claude 3.7 Sonnet 似乎即将发布。业界预计&#xff0c;亚马逊可能会在2025年2月26日的活动中公布相关消息。泄露的信息表明&#xff0c;该模型将托管于 AWS Bedrock 平台&#xff0c;该平台以提供尖端 AI 模型访问而闻名…...

ONNX转RKNN的环境搭建和部署流程

将ONNX模型转换为RKNN模型的过程记录 工具准备 rknn-toolkit:https://github.com/rockchip-linux/rknn-toolkit rknn-toolkit2:https://github.com/airockchip/rknn-toolkit2 rknn_model_zoo:https://github.com/airockchip/rknn_model_zoo ultralytics_yolov8:https://github…...

解决鼠标唤醒关屏状态下的笔记本

以下是通过计划任务和PowerShell实现鼠标唤醒控制的全网独家解决方案,基于Windows事件触发机制,结合设备管理API实现精准控制,最终实现仅需通过win+l锁定屏幕,再关闭屏幕,既不会出现唤醒笔记问的问题: 一、技术原理深度解析 1. 事件触发机制 Windows安全子系统在锁屏/…...

MongoDB 复制(副本集)

MongoDB 复制(副本集) 引言 MongoDB是一个高性能、可扩展、易于使用的文档存储系统。它以JSON-like的文档存储结构&#xff0c;支持灵活的数据模型。在分布式系统中&#xff0c;为了提高数据可用性和系统稳定性&#xff0c;常常需要实现数据的备份和冗余。MongoDB提供了副本集…...

聊聊 FocusSearch/focus_mcp_sql:Text2SQL 的新玩法

聊聊 FocusSearch/focus_mcp_sql&#xff1a;Text2SQL 的新玩法 最近在 GitHub 上逛的时候&#xff0c;发现了一个挺有意思的项目——FocusSearch/focus_mcp_sql。作为一个对 Text2SQL 有点小研究的前端码农&#xff0c;我忍不住想和大家聊聊这个工具。它不像那些常见的基于大…...

Linux红帽:RHCSA认证知识讲解(二)配置网络与登录本地远程Linux主机

Linux红帽&#xff1a;RHCSA认证知识讲解&#xff08;二&#xff09;配置网络与登录本地远程Linux主机 前言一、使用命令行&#xff08;nmcli 命令&#xff09;配置网络&#xff0c;配置主机名第一步第二步修改主机名称 二、使用图形化界面&#xff08;nmtui 命令&#xff09;配…...

C#开发——ConcurrentDictionary集合

ConcurrentDictionary<TKey, TValue> 是 C# 中一个专为多线程场景设计的线程安全字典集合&#xff0c;位于 System.Collections.Concurrent 命名空间中。它允许多个线程同时对字典进行读写操作&#xff0c;而无需额外的同步措施。 一、集合特征 此集合有如下特征…...

深入浅出ES6:现代JavaScript的基石

ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的一次重大更新&#xff0c;引入了许多新特性&#xff0c;使JavaScript更加强大、优雅和易于维护。这些特性已经成为现代JavaScript开发的基石&#xff0c;掌握它们对于任何JavaScript开发者都至关重要。本文将深入…...

小型字符级语言模型的改进方向和策略

小型字符级语言模型的改进方向和策略 一、回顾小型字符级语言模型的处理流程 前文我们已经从零开始构建了一个小型字符级语言模型,那么如何改进和完善我们的模型呢?有哪些改进的方向?我们先回顾一下模型的流程: 图1 小型字符级语言模型的处理流程 (1)核心模块交互过程:…...

一周学会Flask3 Python Web开发-Jinja2模板访问对象

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 如果渲染模板传的是对象&#xff0c;如果如何来访问呢&#xff1f; 我们看下下面示例&#xff1a; 定义一个Student类 cla…...

vue 3D 翻页效果

<template><view class"swipe-container" touchstart"onTouchStart" touchmove"onTouchMove" touchend"onTouchEnd"><view class"page">初始页</view></view> </template><script&g…...

JSONL 是什么格式

JSONL&#xff08;JSON Lines&#xff09;格式是一种简洁的文件格式&#xff0c;它将每一行作为一个独立的JSON对象&#xff0c;每个对象之间通过换行符分隔。JSONL常用于处理大规模数据&#xff0c;特别是在日志文件、机器学习数据集或数据流应用中。 示例 假设我们有以下3条…...

npm : 无法加载文件 E:\ProgramFiles\Nodejs\npm.ps1,因为在此系统上禁止运行脚本。

这个错误是因为 Windows 系统的 PowerShell 执行策略 限制了脚本的运行。默认情况下&#xff0c;PowerShell 的执行策略是 Restricted&#xff0c;即禁止运行任何脚本。以下是解决该问题的步骤&#xff1a; 1. 检查当前执行策略 打开 PowerShell&#xff08;管理员权限&#x…...

pycharm 调试 debug 进入 remote_sources

解决办法1&#xff1a; pycharm函数跳转到remote_sources中的文件中_pycharm修改remotesource包存放地址-CSDN博客 file->settings->project structure将项目文件夹设为"Sources"&#xff08;此时文件夹会变为蓝色&#xff09;。 解决方法2 Debug:使用Pychar…...

测试面试题:以一个登录窗口为例,设计一下登录界面测试的思路和方法

在测试登录窗口时,可以从 表单测试、 逻辑判断和 业务流程三个方面设计测试思路和方法。以下是一个详细的测试方案: 1. 表单测试 表单测试主要关注输入框、按钮等UI元素的正确性和用户体验。 测试点: 输入框测试 用户名和密码输入框是否正常显示。输入框是否支持预期的字符类…...

[特殊字符] 蓝桥杯 Java B 组 之最小生成树(Prim、Kruskal) 并查集应用

Day 3&#xff1a;最小生成树&#xff08;Prim、Kruskal&#xff09; & 并查集应用 &#x1f4d6; 一、最小生成树&#xff08;MST&#xff09;简介 最小生成树&#xff08;Minimum Spanning Tree, MST&#xff09; 是一个 无向连通图 的 最小代价子图&#xff0c;它包含 …...

【蓝桥杯】1.k倍区间

前缀和 #include <iostream> using namespace std; const int N100010; long long a[N]; int cnt[N]; int main(){int n, m;cnt[0] 1;cin >> n >> m;long long res 0;for(int i 1; i < n; i){scanf("%d", &a[i]);a[i] a[i-1];res cnt…...

机器人部分专业课

华东理工 人工智能与机器人导论 Introduction of Artificial Intelligence and Robots 必修 考查 0.5 8 8 0 1 16477012 程序设计基础 The Fundamentals of Programming 必修 考试 3 64 32 32 1 47450012 算法与数据结构 Algorithm and Data Structure 必修 考试 3 56 40 …...

SpringBoot两种方式接入DeepSeek

方式一&#xff1a;基于HttpClient 步骤 1&#xff1a;准备工作 获取 DeepSeek API 密钥&#xff1a;访问 DeepSeek 的开发者平台&#xff0c;注册并获取 API 密钥。 步骤 2&#xff1a;引入依赖 <dependency><groupId>org.springframework.boot</groupId&g…...

Maven——Maven开发经验总结(1)

摘要 本文总结了 Maven 开发中的多个关键经验&#xff0c;包括如何根据版本号决定推送到 releases 或 snapshots 仓库&#xff0c;如何在构建过程中跳过测试&#xff0c;父项目如何控制子项目依赖版本&#xff0c;父项目依赖是否能传递到子项目&#xff0c;如何跳过 Maven dep…...

DeepSeek掘金——调用DeepSeek API接口 实现智能数据挖掘与分析

调用DeepSeek API接口:实现智能数据挖掘与分析 在当今数据驱动的时代,企业和开发者越来越依赖高效的数据挖掘与分析工具来获取有价值的洞察。DeepSeek作为一款先进的智能数据挖掘平台,提供了强大的API接口,帮助用户轻松集成其功能到自己的应用中。本文将详细介绍如何调用D…...

gitlab 解决双重认证无法登录remote: HTTP Basic: Access denied.

问题&#xff1a;gitlab开启了双因素认证导致无法正常使用 如进行了 OAuth configuration 在进行git操作时如下提示 remote: HTTP Basic: Access denied. The provided password or token is incorrect or your account has 2FA enabled and you must use a personal access…...

【Microsoft PowerPoint for Mac】2分钟配置-MAC一键删除PPT中的所有备注

MAC一键删除PPT中的所有备注 1.搜索自动操作2.点击快速操作3.搜索并运行AppleScript4.输入代码&#xff0c;并选择只应用于Microsoft PowerPoint for Mac【右上角】5. CRTLS保存为“清除当前文稿中的所有备注”&#xff0c;PPT中应用。 MAC没自带&#xff0c;需要自己配置 1.搜…...