Linux线程 概念、特点、线程间资源共享情况

news2024/11/23 1:02:16

1. 线程概念

线程是轻量级的进程;Linux中,线程本质上仍是进程。

进程是OS分配资源的最小单位,线程是OS调度的最小单位。

NPTL

当前Linux线程库为redHat开发的NPTL,查看本地线程库版本:

getconf GNU_LIBPTHREAD_VERSION


 2. 线程特点

(1)轻量级的进程(Light-Weight Process),也有PCB;

(2)无论是创建进程的fork,还是创建线程的pthread_create,底层都是调用内核函数clone;

(3)若复制(深拷贝,但有“COW”优化)父进程地址空间,则为进程;若共享(浅拷贝)父进程地址空间,则为线程。

(4)Linux内核不区分进程和线程,只在上层应用区分;

(5)线程操作函数pthread_*是库函数,而非系统调用。

线程优点

(1)提高并发性;

(2)开销小;

(3)共享数据方便;

线程缺点

(1)库函数,不稳定;

(2)调试困难;

(3)信号支持不好。


3. 线程间共享资源和非共享资源

(1)线程共享资源

        ① 文件描述符表

        ② 各信号处理方式

        ③ 当前工作目录

        ④ 用户ID和组ID

        ⑤ 内存地址空间中的 .txt、.data、.bss、.heap、.共享库

(2)线程非共享资源

        ① 线程id

        ② 处理器现场和栈指针(内核栈)

        ③ 线程栈(用户空间栈)

        ④ errno变量

        ⑤ 信号屏蔽字

        ⑥ 调度优先级

线程共享资源测试:

主线程、子线程对全局num、堆区变量修改:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>

int num = 100;  // 全局变量

void* func(void* arg) {

    int* pn = (int*)arg;

    printf("修改前, 子线程中的全局变量num = %d, 堆区变量*p = %d\n", num, *pn);
    num++;
    (*pn)++;
    printf("修改后, 子线程中的全局变量num = %d, 堆区变量*p = %d\n", num, *pn);

    return NULL;
}

int main(int argc, const char* argv[]) {

    pthread_t tid;
    int ret = -1;
    int* p = NULL;

    memset(&tid, 0, sizeof(tid));

    // 分配堆空间
    p = malloc(sizeof(int));
    if (NULL == p) {
        perror("malloc");
        return 1;
    }
    memset(p, 0, sizeof(int));

    *p = 10;

    // 创建一个线程
    ret = pthread_create(&tid, NULL, func, (void*)p);
    if (0 != ret) {
        printf("线程创建失败...\n");
        return 1;
    }

    printf("按回车键继续.\n");
    getchar();
    printf("修改后, 主线程中的全局变量num = %d, 堆区变量*p = %d\n", num, *p);

    free(p); // 只能释放一次,因为堆区是共享的,只有一个*p

    return 0;
}

运行结果:

 可知同一进程中的线程共享.data区、heap区,此外还共享代码区、.bss区。

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

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

相关文章

【C++】三元操作符、创建并初始化C++对象、C++new关键字

C的三元操作符 if的语法糖 例1 #include <iostream> #include <string>static int s_Level 1; static int s_Speed 2;int main() {if (s_Level > 5){s_Speed 10;}else{s_Speed 5;}std::cin.get(); }用三元操作符&#xff1a; s_Speed s_Level > 5 ?…

基础篇-并发篇

**63.线程状态 添加主线程和子线程 ** 65.线程状态 核心线程和任务队列都是有上限的&#xff0c;所以都满了话就开始使用救急线程; 救急线程也是有上限的&#xff0c;如果再来新的线程的话就需要拒绝策越; 注意&#xff1a;这里不需要等待5000ms&#xff0c;几乎是同时打印 注…

[230503] 2021年托福阅读真题第1篇|Grinding Grain 磨粒

11:21&#xff5e;11:41 慢 20min 正确率&#xff1a;6.5/10 题目来源&#xff1a;链接: https://pan.baidu.com/s/15FYCuD7__slfGvdsBIHgLQ 提取码: iynj --来自百度网盘超级会员v5的分享【内含2021年100篇托福阅读真题】 目录 Grinding Grain 题目 Grinding Grain It now…

2016 ICPC合肥站 传递 HDU-5961(拓扑排序 / bitset / 暴力(可hack))

题目链接&#xff1a;HDU-5961 传递 中文题面就不解释题目意思&#xff0c;解释一下名词的意思 完全图&#xff1a;对于一个无向图 G G G 而言&#xff0c;设点集为 V V V&#xff0c;点集中任意不相同两点 u , v u, v u,v 间都有且仅有一条边叫做完全图。 竞赛图&#xff1…

【玩转Git三剑客笔记】第一章 Git基础

第一章 Git基础 1.综述2.安装Git3.使用Git之前需要做的最小配置4.创建第一个仓库并配置local用户信息1.创建Git仓库2.设置Git最小配置 5.通过几次commit来认识工作区和暂存区1.将工作区中所有已经被git追踪的文件一起添加到暂存区2.git log查看提交日志 6.给文件重命名的简便方…

密码学【java语言】初探究

文章目录 前言一 密码学1.1 古典密码学1.1.1 替换法1.1.2 移位法1.1.3 古典密码破解方式 二 近代密码学2.1 现代密码学2.1.1 散列函数2.1.2 对称密码2.1.3 非对称密码 二 凯撒加密的实践2.1 基础知识&#xff1a;ASCII编码2.2 ascii编码演示2.3 凯撒加密和解密实践2.4 频率分析…

安装Ubuntu22.04虚拟机的一些常见问题解决方法

文章目录 VirttalBox 开启共享剪切板文件夹、拖放的功能VirtualBox 安装 ubuntu后安装增强工具无效的解决办法解决ubuntu您没有权限查看“ 某某文件夹”的内容所需的权限linux更换源的两种方法[如何在 Ubuntu 20.04 上安装 Visual Studio Code - ](https://zhuanlan.zhihu.com/…

【Java入门合集】第二章Java语言基础(二)

【Java入门合集】第二章Java语言基础&#xff08;二&#xff09; 博主&#xff1a;命运之光 专栏JAVA入门 学习目标 掌握变量、常量、表达式的概念&#xff0c;数据类型及变量的定义方法&#xff1b; 掌握常用运算符的使用&#xff1b; 掌握程序的顺序结构、选择结构和循环结构…

权限提升:不带引号服务路径 || 不安全的服务权限.

权限提升&#xff1a;不带引号服务路径 || 不安全的服务权限. 权限提升简称提权&#xff0c;由于操作系统都是多用户操作系统&#xff0c;用户之间都有权限控制&#xff0c;比如通过 Web 漏洞拿到的是 Web 进程的权限&#xff0c;往往 Web 服务都是以一个权限很低的账号启动…

Nature:李龙等揭示抑郁症模型中社交压力阻断社交奖赏的神经环路机制

在人类社会中&#xff0c;社会压力尤其是创伤性社会经历会导致抑郁症、社交焦虑及创伤后应激障碍等多种精神疾病【1】。在抑郁症研究领域&#xff0c;有研究表明社会创伤会损害大脑负责奖赏的脑区功能&#xff0c;使社交活动变得不再有奖赏性&#xff0c;从而导致严重的社交回避…

【ShenYu系列】ShenYu Dubbo插件全流程源码解析

网关启动 在ShenyuConfiguration注入ShenyuWebHandler。 Bean("webHandler")public ShenyuWebHandler shenyuWebHandler(final ObjectProvider<List<ShenyuPlugin>> plugins, final ShenyuConfig config, Lazy final ShenyuLoaderService shenyuLoaderS…

初识Go语言20-包与工程化【用go mod管理工程、包引入规则、init调用链、可见性】

文章目录 包与工程化用go mod管理工程包引入规则init调用链可见性 包与工程化 用go mod管理工程 初始化项目: go mod init $module_name$module_name和目录名可以不一样。上述命令会生成go.mod文件&#xff0c;该文件内容形如&#xff1a; module go-coursego 1.17require (…

HarmonyOS服务卡片开发-文件组织与配置学习

HarmonyOS服务卡片开发-文件组织与配置学习 1.文件组织 目录结构 JS服务卡片(entry/src/main/js/Component)的典型开发目录结构如下&#xff1a; 目录结构中文件分类如下&#xff1a; .hml结尾的HML模板文件&#xff0c;这个文件用来描述卡片页面的模板布局结构。 .css结…

云计算(Cloud Computing)

一、从技术概念理解云计算 早期的云计算就是虚拟化主机上的分布式计算&#xff0c;现阶段的云计算&#xff0c;已经不单单是一种分布式计算&#xff0c;而是分布式计算、效用计算、负载均衡、并行计算、网络存储、热备份冗杂和虚拟化等计算机技术混合演进并跃升的结果。云计算…

飞书接入ChatGPT,打造属于自己的智能问答助手

文章目录 前言环境列表视频教程1.飞书设置2.克隆feishu-chatgpt项目3.配置config.yaml文件4.运行feishu-chatgpt项目5.安装cpolar内网穿透6.固定公网地址7.机器人权限配置8.创建版本9.创建测试企业10. 机器人测试 转载自远控源码文章&#xff1a;飞书接入ChatGPT - 将ChatGPT集…

太酷了,库昊

昨天晚上凌晨3点30&#xff0c;勇士和国王的第7场比赛开打。 在上一局在勇士主场干翻勇士后&#xff0c;国王队的信心倍增&#xff0c;他们用自己的节奏一次次击溃勇士&#xff0c;特别是今天的前两节&#xff0c;国王能能够回应勇士的进球&#xff0c;防守也更有侵略性。今天不…

Spring第九阶段:Spring的注解功能

注解功能 1、注解配置Dao、Service、Controller组件 通过注解分别创建Dao、Service、Controller Spring配置bean的常用注解有 Controller 配置web层的组件 Service 配置Service组件 Repository 配置Dao组件 Component 配置JavaBean( 除Service , Dao , Controller组件之外的…

台积电和三星都变脸了,美国图谋失败,外媒:拜登心都碎了

美国的图谋甚大&#xff0c;然而美国的图谋却又如此迅速的浮现&#xff0c;看穿美国图谋的台积电和三星两家芯片企业如今不干了&#xff0c;这将破坏美国的计划&#xff0c;让美国无可奈何。 一、美国精心编织的大网 从数年前开始&#xff0c;美国就要求台积电和三星上交机密数…

想学编程但没有好的资料 来这 Python 爬取信息并写入数据,最详细教程

提示一下&#xff1a;我这个中一些用import引用的软件包&#xff0c;你们小白记得要下载哟 不然的话会报错的哟&#xff01; 下载软件包很简单的! 话不多说&#xff0c;直接开始… from selenium.webdriver.common.by import By from selenium import webdriver import re, …

5月2日第壹简报,星期二,农历三月十三

5月2日第壹简报&#xff0c;星期二&#xff0c;农历三月十三坚持阅读&#xff0c;静待花开1. “港车北上”政策公布&#xff1a;6月1日起接受申请&#xff0c;7月1日起可驶入广东&#xff0c;将惠及45万香港车主。2. 全球女性第一人&#xff01;董红娟登顶全部14座8000米级高峰…