03LinuxC线程学习之线程共享和非共享

2023-11-20

1 线程共享和非共享

1.1 线程共享资源

  • 1)文件描述符表。由于线程间共享进程间的内容,而文件描述符表在主线程的PCB当中,各个线程可以直接去请求访问,所以线程间通信就不需要像进程那样通过管道这些方式通信。
  • 2)每种信号的处理方式。即当某个信号发送到该进程时,该进程有多个线程,那么哪个线程捕捉到就谁处理。但mask是不共享的,所以可以通过这个指定某个线程接收。但不建议信号与线程混用,难度很大。
  • 3)当前工作目录。物理内存地址相同,所以工作目录相同。因为工作目录的物理地址是唯一的。只有物理内存地址相同才能保证工作目录相同。
  • 4)用户ID和组ID。很简单,因为都在0-3G的用户空间。
  • 5)内存地址空间 (.text/.data(全局区)/.bss(静态区)/heap/共享库)。(线程间栈独立,堆共享)

1.2 线程非共享资源

  • 1)线程id。
  • 2)处理器现场和栈指针(内核栈)。(上面说了,线程间栈独立,堆共享)
  • 3)独立的栈空间(用户空间栈)。
  • 4)errno变量。注:errno是全局变量,本来应该是共享的,但是就这么巧,它是唯一一个全局变量不共享的。
  • 5)信号屏蔽字。不共享因为需要它去拦截对应信号,实现某个信号给指定线程处理。
  • 6)调度优先级。

2 线程优、缺点

  • 1)优点: 1. 提高程序并发性;2. 开销小;3. 数据通信、共享数据方便。
  • 2)缺点: 1. 库函数,不稳定;2. 调试、编写困难、gdb不支持;3. 对信号支持不好。
  • 3)优点相对突出,缺点均不是硬伤。Linux下由于实现方法导致进程、线程差别不是很大。

3 总结

实际上工作时,我们只需要记住这句话即可:线程间栈独立,堆共享。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

03LinuxC线程学习之线程共享和非共享 的相关文章

  • 对 sf:: 的未定义引用

    我想用 C 制作 GUI 应用程序 发现 SFML 是一个不错的选择 幸运的是 我使用的是 Linux 所以 SFML 2 4 已经安装在我的系统上 所以我开始搜索一些教程并找到了一个制作简单窗口的教程 但是当我运行代码时 出现错误 提示未
  • xdotool 类型需要很长时间并导致整个桌面冻结

    我一直在使用xdotool type过去只能在快捷方式上输入耸肩xdotool type 这可行 但总是需要相当长的时间 并导致整个桌面冻结 完全冻结 而不仅仅是输入 几秒钟 不过并没有太打扰我 现在我需要一种方法来从文件中读取内容 对其进
  • 使用 MongoDB docker 镜像停止虚拟机而不丢失数据

    我已经在 AWS EC2 上的虚拟机中安装了官方的 MongoDB docker 映像 并且数据库上已经有数据 如果我停止虚拟机 以节省过夜费用 我会丢失数据库中包含的所有数据吗 在这些情况下我怎样才能让它持久 有多种选择可以实现此目的 但
  • 使用 sed 将 old-link-url 替换为 new-link-url

    我正在 bash 中编写一个脚本 将 old link url 替换为 new link url 我的问题是 sed 由于斜杠而无法替换 url 如果我只输入一些文字就可以了 my code sed e s old link new lin
  • 变量作为 bash 数组索引?

    bin bash set x array counter 0 array value 1 array 0 0 0 for number in array do array array counter array value array co
  • 使用netcat将unix套接字传输到tcp套接字

    我正在尝试使用以下命令将 unix 套接字公开为 tcp 套接字 nc lkv 44444 nc Uv var run docker sock 当我尝试访问时localhost 44444 containers json从浏览器中 它不会加
  • 退出 bash 脚本但保持进程运行

    我正在运行服务器 需要使用参数执行以下命令 这些脚本目前工作得很好 但问题是当我运行脚本时我无法返回到控制台 它在控制台中保持运行 如果我强行停止它 那么该过程也会停止 我想继续运行该进程并返回到控制台 bin sh php home st
  • 将 stdout 作为命令行 util 的文件名传递?

    我正在使用一个命令行实用程序 该实用程序需要传递文件名以将输出写入 例如 foo o output txt 它唯一写入的东西stdout是一条消息 表明它运行成功 我希望能够通过管道传输写入的所有内容output txt到另一个命令行实用程
  • 如何从“git log”中查看 Git 中的特定版本?

    My git log显示为 enter code here git trial git log commit 4c5bc66ae50780cf8dcaf032da98422aea6e2cf7 Author king lt email pro
  • 通过 SSH 将变量传递给远程脚本

    我正在通过 SSH 从本地服务器在远程服务器上运行脚本 首先使用 SCP 复制该脚本 然后在传递一些参数时调用该脚本 如下所示 scp path to script server example org another path ssh s
  • 如何仅将整个嵌套目录中的头文件复制到另一个目录,在复制到新文件夹后保持相同的层次结构

    我有一个目录 其中有很多头文件 h 和其他 o 和 c 文件以及其他文件 这个目录里面有很多嵌套的目录 我只想将头文件复制到一个单独的目录 并在新目录中保留相同的结构 cp rf oldDirectory newDirectory将复制所有
  • Linux 文本文件操作

    我有一个格式的文件 a href a href a href a href 我需要选择 之后但 之前的文本 并将其打印在行尾 添加后 例如 a href http www wowhead com search Su a a a a a
  • grails 上的同步块在 Windows 上有效,但在 Linux 上无效

    我有一个 grails 应用程序 它依赖于服务中的同步块 当我在 Windows 上运行它时 同步按预期工作 但当我在 ams linux 上运行时 会出现 StaleObjectStateException 该问题在以下示例中重现 cla
  • 如何在 Linux x86_64 上模拟 iret

    我正在编写一个基于 Intel VT 的调试器 由于当 NMI Exiting 1 时 iret 指令在 vmx guest 中的性能发生了变化 所以我应该自己处理vmx主机中的NMI 否则 guest会出现nmi可重入错误 我查了英特尔手
  • 在 shell 脚本中查找和替换

    是否可以使用 shell 在文件中搜索然后替换值 当我安装服务时 我希望能够在配置文件中搜索变量 然后在该值中替换 插入我自己的设置 当然 您可以使用 sed 或 awk 来完成此操作 sed 示例 sed i s Andrew James
  • 如何使用AWK脚本检查表的所有列数据类型? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在这里 我正在检查表中第一列的数据类型 但我想知道AWK中表的所有列数据类型 我尝试过 但只能获得一列数据类型 例如 Column 1
  • 如何让 clangd 转向 c++20

    当没有其他信息时 如何让 clangd 回退到 c 20 例如 在第一次构建之前 cmake 可以生成一个 这是在带有最新 LLVM 的 Arch Linux 上 这是通过 Emacs LSP 运行的 但这应该没有什么区别 你可以加 Com
  • 构建 makefile 依赖/继承树

    如果我解释得不好或者问了一些明显的问题 我很抱歉 但我是 Linux 内核的新手 而且有点深入 我们有一个嵌入式 Linux 系统 它附带一个 文档非常糟糕的 SDK 其中包含数百个文件夹stuff 大多数文件夹包含rules make m
  • git在Windows和Linux之间切换后强制刷新索引

    我有一个Windows和Linux共享的磁盘分区 格式 NTFS 它包含一个 git 存储库 约 6 7 GB 如果我只使用Windows or 只使用Linux操作 git 存储库一切正常 但是每次切换系统的时候git status命令将
  • 在 LINUX 上使用 Python 连接到 OLAP 多维数据集

    我知道如何在 Windows 上使用 Python 连接到 MS OLAP 多维数据集 嗯 至少有一种方法 通常我使用 win32py 包并调用 COM 对象进行连接 import win32com client connection wi

随机推荐

  • 全面分析冒泡排序过程

    冒泡排序也是一种简单直观的排序算法 其思想是 它重复地走访过要排序的数列 一次比较两个元素 如果他们的顺序错误就把他们交换过来 走访数列的工作是重复地进行直到没有再需要交换 也就是说该数列已经排序完成 这个算法的名字由来是因为越小的元素会经
  • leetcode分类刷题:二分查找(Binary Search)(二、隐藏有序序列的数学类型)

    参加了下2023届秋招 不得不感叹leetcode lintcode的题目实在太多了 也很难 特别对于我这种非科班生而言 感觉有必要分类整理一下 以便以后在工作中更好的应用 花了点时间刷了下二分查找的相关题目 刷的越多 反而越不会了 先把目
  • 还没做完的小程序

    include
  • 基于swiper使用vue-awesome-swiper 实现鼠标移入暂停自动播放、左右按钮控制前进后退、常见避坑、API中文文档地址

    vue 中使用swiper vue awesome swiper 鼠标移入暂停自动播放 左右按钮控制前进后退 常见避坑 swiper对应vue awesome swiper版本会带来很多坑点 推荐下面对照版本 帮大家避坑了 亲测可用 一 n
  • oracle 中的开窗函数over()

    开窗函数与聚合函数一样 都是对行的集合组进行聚合计算 它用于为行定义一个窗口 这里的窗口是指运算将要操作的行的集合 它对一组值进行操作 不需要使用GROUP BY子句对数据进行分组 能够在同一行中同时返回基础行的列和聚合列 反正我理解这个函
  • 原生-秒数转换为小时、分钟

    function formatSeconds value var secondTime parseInt value 秒 var minuteTime 0 分 var hourTime 0 小时 if secondTime gt 60 如果
  • Python实现迷宫游戏

    项目 迷宫游戏 摘要 1 引言 1 1研究的背景及意义 1 2研究的内容 2 系统结构 2 1系统的结构 2 2基本思路 3 实现代码 3 1Maze类 3 2Player类 3 3Controller类 3 4主函数 4 实验 5 总结和
  • JS修改对象属性的值

    当对象以数字为属性名时 其实就是一个数组 用 var foo 1 a 2 b foo 1 c console log foo 1 c 2 b 当对象以字符为属性名时 直接用 获取属性值 var bar a 1 b 2 c 3 bar a h
  • Java反射获取泛型

    反射泛型方法说明 1 isPrimitive 判断指定的Class对象是否表示一个基本类型 2 isAssignableFrom 表示class是否是参数class的父类 3 ParameterizedType 表示参数化类型如List 4
  • Echarts配置系列-图文并茂教你配置渐变色面积图,折柱双图,环形图,仪表盘图等

    文章目录 说明 渐变色面积图 如何修改图标legend样式 如何去掉折线图小圆点 如何设置粗细 折线图线条设置更细或者更粗 如何修改X轴Y轴字体大小 横向渐变色柱状图 自动转动炫酷百分比环形图 渐变色仪表盘 简约风格圆环百分比仪表盘图 双柱
  • 模板类成员函数特化写法

    昨天有对模板类的函数成员特化需求 目的是为了对不同模板参数实现不同的操作 结果在写过程中碰到already defined的问题 貌似是模板新手最容易碰到的问题了 类外的成员函数和同在类外的特化版本成员函数冲突了 因为对模板用法不是很熟悉
  • java poi 将公文套红 并 电子签章

    套红的方法 签章 import com deepoove poi XWPFTemplate import com deepoove poi xwpf NiceXWPFDocument import lombok extern slf4j S
  • RSA公钥每次签名得到的结果都一样?

    这里记录下 RSA对于同一数据块签名一致的原因是使用的填充算法 涉及PKCS 1 5 PSS 为什么RSA公钥每次加密得到的结果都不一样 RSA PSS数字签名算法
  • nginx的sticky模块

    Sticky工作原理 Sticky是nginx的一个模块 它是基于cookie的一种nginx的负载均衡解决方案 通过分发和识别cookie 来使同一个客户端的请求落在同一台服务器上 默认标识名为route 1 客户端首次发起访问请求 ng
  • neo4j windows图像界面 如何查询最短路径

    MATCH p1 concept name factor p2 concept name cf4 p allshortestpaths p1 10 p2 RETURN p 注意上述p1是变量这个是通用的 只需要更改concept这个即可 你
  • 使用Notepad++工具查看文件的十六进制

    最近在用notepad 打开 dat文件 想看看里面的一些数据但是打开之后发现是乱码 下面给出解决方法 1 首先打开 dat文件 发现是一些乱码 2 点击 插件 gt 搜索hex gt 找到HEX Editor勾选 gt 安装 3 重新打开
  • stm32对flash的读写保护与解除

    一 STM32对内部Flash的保护措施 所有STM32的芯片都提供对Flash的保护 防止对Flash的非法访问 写保护和读保护 1 读保护即大家通常说的 加密 是作用于整个Flash存储区域 一旦设置了Flash的读保护 内置的Flas
  • Nginx跨域配置

    一 跨域概述 1 1 同源策略 同源策略是一个安全策略 同源 指的是协议 域名 端口相同 浏览器处于安全方面的考虑 只允许本域名下的接口交互 不同源的客户端脚本 在没有明确授权的情况下 不能读写对方的资源 同源策略主要是基于如下可能的安全隐
  • 解决labelImg闪退问题

    问题 打开labelImg按下键盘任意键闪退 解决办法 降低python版本 博主将python版本从3 10降低至3 8 并且重新安装了pyqt5 sip和lxml两个包即可正常使用labelImg
  • 03LinuxC线程学习之线程共享和非共享

    1 线程共享和非共享 1 1 线程共享资源 1 文件描述符表 由于线程间共享进程间的内容 而文件描述符表在主线程的PCB当中 各个线程可以直接去请求访问 所以线程间通信就不需要像进程那样通过管道这些方式通信 2 每种信号的处理方式 即当某个