Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >线程属性设置

线程属性设置

作者头像
我与梦想有个约会
发布于 2023-10-20 09:54:42
发布于 2023-10-20 09:54:42
33800
代码可运行
举报
文章被收录于专栏:jiajia_dengjiajia_deng
运行总次数:0
代码可运行

本文将通过一个创建n个线程的案例来展示一下线程属性的设定及使用,通常情况下,系统对于线程的创建是没有限制的,但是每一个线程都是需要一个栈空间的,每个栈空间大小也都是固定的,可通过系统命令 ulimit -a 来查看,如果线程栈空间的总数超过了一个进程可使用的虚拟内存用户空间,那么就无法再继续创建线程了。我们只是做一个小的测试,调整每个线程的栈空间大小来揭露线程属性的使用方法,并提高一个程序创建线程的数量(Notice:提高线程数量并没有什么好处,我们只是为了演示如何修改线程属性)。


【普通的创建线程案例】

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
void* dowork()
{
while(1)
{
sleep(1);
}
}
int main(int argc, char* argv[])
{
int i = 0;
int res;
pthread_t tid;
while(1){
// 无限创建线程,直到遇到错误为止
if((res = pthread_create(&tid, NULL, dowork, NULL)))
{
printf(%s\n”, strerror(res));
break;
}
// 每成功创建一个线程将 i++
i++;
}
// 最后打印 i 的值
printf(%d\n”, i);
return 0;
}

该程序运行后,效果如下图:

程序最终创建了 381 个线程,每个线程使用的栈大小是系统默认的,这个默认值可以如下:

381 * 8192Byte = 3121152Byte,只是字节数 Byte,3121152Byte / 1024Byte = 3048MB 得到的是 KByte,而每个进程可使用的虚拟内存用户空间的大小是 3GB (1024 * 3)= 3072MB。可以看出,我们的程序已经快将虚拟内存用户空间使用完了,所以程序再次分配线程失败了。


而如果我们将每一个线程的栈大小设定的更小了(线程属性设置),是不是就可以提高创建线程的数量呢?看如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#define STACK_SIZE 1024 * 1024
void* dowork()
{
while(1)
{
sleep(1);
}
}
int main(int argc, char* argv[])
{
int i = 0;
int res;
char* pStack;
pthread_t tid;
// 初始化线程属性结构
pthread_attr_t attr;
pthread_attr_init(&attr);
// 设定线程属性为分离属性
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
while(1){
// 分配栈空间
pStack = malloc(STACK_SIZE);
if (NULL == pStack) break;
// 设置线程栈大小
pthread_attr_setstack(&attr, pStack, STACK_SIZE);
// 创建线程
if((res = pthread_create(&tid, &attr, dowork, NULL)))
{
printf(%s\n”, strerror(res));
break;
}
i++;
}
// 销毁线程属性结构
pthread_attr_destroy(&attr);
printf(%d\n”, i);
return 0;
}

程序将线程的栈大小调整为 1024Byte * 1024Byte = 1MB,然后再次循环创建线程,效果如下图:

程序最终创建了 3055 个线程,每个线程  1MB * 3055 = 3055MB,也逼近了可使用的虚拟内存用户空间的大小。至此我们验证了线程数量的创建取决于栈大小并且学会了如何设定一个线程的属性。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
初谈Linux多线程--线程控制
在Linux中,线程执行的是进程代码的一部分,也就是说,线程是进程的实体,可以看作是进程内的一个执行单元,我们将这些不同的执行单元称之为轻量级进程,不同线程之间可以通过共享内存来进行通信。
南桥
2024/08/02
2230
初谈Linux多线程--线程控制
线程(一)线程概念+线程控制
pthread_t 到底是什么类型呢?取决于实现。对于Linux目前实现的NPTL实现而言,pthread_t类型的线程ID,本质就是一个进程地址空间上的一个地址。
海盗船长
2020/08/27
1.1K0
linux网络编程之posix 线程(二):线程的属性和 线程特定数据 Thread-specific Data
本文介绍了多线程和多进程的区别,从多个方面进行对比,包括资源占用、调度开销、并发度、线程局部存储、线程间通信、资源竞争、性能评估等方面。同时,还介绍了多线程在操作系统、数据库、网络编程、高性能计算等领域的应用,以及多线程技术的未来展望。
s1mba
2017/12/28
1.1K0
linux网络编程之posix 线程(二):线程的属性和 线程特定数据 Thread-specific Data
《Android 创建线程源码与OOM分析》
| 导语 企鹅FM近几个版本的外网Crash出现很多OutOfMemory(以下简称OOM)问题,Crash的堆栈都在Thread::start方法上。该文详细分析了发生原因。 ---- 有两种栈: 出现次数最多的一种,称之为 堆栈A。 java.lang.OutOfMemoryError: pthread_create (1040KB stack) failed: Out of memory java.lang.Thread.nativeCreate(Native Method)
腾讯Bugly
2018/03/23
4.7K0
多线程编程C语言版
什么是多线程,提出这个问题的时候,我还是很老实的拿出操作系统的书,按着上面的话敲下“为了减少进程切换和创建开销,提高执行效率和节省资源,我们引入了线程的概念,与进程相比较,线程是CPU调度的一个基本单位。”
DeROy
2021/11/16
3.7K0
多线程编程C语言版
Linux之多线程(下)——线程控制
与线程有关的函数构成了一个完整的系列,大多数函数名都是以“pthread_”为开头的,要使用这些函数需要引入头文件pthread.h。链接这些线程函数库需要使用编译器命令的-lpthread选项。
摘星
2023/10/15
7220
Linux之多线程(下)——线程控制
并发问题解密:探索多线程和锁机制
描述: pthread_create()函数在调用进程中启动一个新线程。新线程通过调用start_routine()开始执行;arg作为start_routine()的唯一参数传递。
Lion 莱恩呀
2024/09/26
2800
并发问题解密:探索多线程和锁机制
【Linux篇】程控制全揭秘:如何通过 POSIX 库管理线程的生命周期
站在不同的用户角度线程的说法也不同,在用户角度,就称为线程;在操作系统角度称为轻量级进程(也叫做lwp)。
熬夜学编程的小王
2025/05/02
1110
【Linux篇】程控制全揭秘:如何通过 POSIX 库管理线程的生命周期
Linux线程控制
本篇我将学习如何使用多线程。要使用多线程,因为Linux没有给一般用户直接提供操作线程的接口,我们使用的接口,都是系统工程师封装打包成原生线程库中的。那么就需要用到原生线程库。因此,需要引入-lpthread,即连接原生线程库。
二肥是只大懒蓝猫
2023/03/30
1.1K0
Linux线程控制
【Linux探索学习】第二十九弹——线程概念:Linux线程的基本概念与线程控制详解
https://blog.csdn.net/2301_80220607/category_12805278.html?spm=1001.2014.3001.5482
GG Bond1
2025/02/19
1530
【Linux探索学习】第二十九弹——线程概念:Linux线程的基本概念与线程控制详解
线程的概念及linux下线程库相关函数的使用
1.线程的概念 在linux操作系统下,线程的本质任然是进程。是轻量级的进程(light weight process)简称LWP,但线程与进程还是有很多的区别。
lexingsen
2022/02/24
5950
线程的概念及linux下线程库相关函数的使用
《Linux操作系统编程》 第十章 线程与线程控制: 线程的创建、终止和取消,detach以及线程属性
​ 通过对线程与线程控制的相关知识点的编程学习和锻炼,培养学生们对线程相关实例问题的分析与解决能力。
猫头虎
2024/04/08
2590
《Linux操作系统编程》 第十章 线程与线程控制: 线程的创建、终止和取消,detach以及线程属性
初识协程栈
今天开始《Go语言轻松进阶》系列第二章「内存与垃圾回收」第3小节「Go语言垃圾回收原理」。
用户1093396
2023/09/01
2140
初识协程栈
Posix线程 它们那一大家子事儿,要觉得好你就收藏进被窝里慢慢看 (1)
官方话就是:是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
看、未来
2020/08/25
3940
Posix线程 它们那一大家子事儿,要觉得好你就收藏进被窝里慢慢看  (1)
pthread_create 线程属性-Pthread并发编程之线程基本元素和状态的剖析
  在本篇文章当中讲主要给大家介绍并发编程当中关于线程的基础概念,并且深入剖析进程的相关属性和设置,以及线程在内存当中的布局形式,帮助大家深刻理解线程。
宜轩
2022/12/26
4850
Linux线程基础
  加载到内存中的程序,我们称为进程。我们创建一个进程,简单来说是,分配进程地址空间,加载各种数据,与物理内存之间建立映射关系等。做完这些动作,我们才能说创建了进程,也就是说,创建一个进程的开销(时间空间成本开销)是很大的。
用户11029129
2024/09/24
1340
Linux线程基础
【Linux】盘点<多线程控制>基本操作&演示:创建&中止&等待&分离
YY的秘密代码小屋
2024/10/17
2050
【Linux】盘点<多线程控制>基本操作&演示:创建&中止&等待&分离
【在Linux世界中追寻伟大的One Piece】多线程(一)
同一地址空间,因此Text Segment、Data Segment都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:
枫叶丹
2024/11/26
1240
【在Linux世界中追寻伟大的One Piece】多线程(一)
【Linux线程】线程控制原语详细介绍
线程就是 Light weight process ,LWP,轻量级进程,在Linux环境下它仍然是进程,一个进程内部可以有多个线程,默认情况下一个进程内部有一个线程。不同的是,进程有自己的进程控制块PCB,并且拥有自己独立的地址空间;而线程虽然也有线程控制块(这样来看,如果一个进程内有多个线程,那么进程内将有多个PCB),但是它没有独立的地址空间,而是共享空间,我们可以理解为在进程的虚拟空间中除了栈都是共享的(在实际编程中,线程一般就是一个函数,函数肯定要有自己的栈来运行)。也就是说,进程和线程最大的区别在于是否共享地址空间。在Linux环境下,线程是最小的执行单位,进程是最小的资源分配单位。
mindtechnist
2024/08/08
1630
【Linux线程】线程控制原语详细介绍
pthread的使用
编译的时候发现,报错对‘pthread_create’未定义的引用,由于pthread库不是Linux系统默认的库,连接时需要使用库libpthread.a,所以在使用pthread_create创建线程时,在编译中要加-lpthread参数:然后重新编译
心跳包
2020/08/31
1.2K0
推荐阅读
相关推荐
初谈Linux多线程--线程控制
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验