Linux下线程(LWP)的相关概念

article/2025/8/23 4:58:08

一.概念

线程:一个进程内部的控制序列。或者说在一个程序里的一个执行路线

首先明确一个概念,在Linux下是没有进程的控制块的,使用进程模拟的线程。一个进程中至少有一个线程。所以进程跟线程的数量是一对(一)多的。

线程跟进程的区别
1.进程是资源分配的基本单位,线程是CPU调度的基本单位。
2.创建一个线程要比创建一个进程更加轻量化,所以我们一般也把线程叫做轻量级进程。
3.进程之间是相互独立的,一个进程的异常不会导致另一个进程的异常;而线程由于共享地址空间,访问共同资源,如果一个线程异常,可能会导致所有的线程都异常。
4.进程之间数据各自私有,互不干扰,而线程大部分资源都是共享的,但也有部分资源各自私有,比如线程ID,线程栈,各自的寄存器等等。
5.进程间通信是比较麻烦的,而线程由于共享数据,通信是很容易的。

以下用到的所有的函数的头文件都是#include <pthread.h>,用到的函数在gcc(g++)编译的时候都要加上 -lpthread

创建线程
要知道,创建线程是比创建进程更轻量化的,创建进程要创建PCB,虚拟地址空间,页表,还要在物理内存上存储存储该进程的数据等等,而在Linux下使用进程模拟的线程,则创建线程只需要创建一个PCB即可,该PCB也指向虚拟地址空间。即线程所用数据就是虚拟地址空间上的数据。我们把创建进程时创建的PCB称为主线程。
在这里插入图片描述
线程创建函数:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

thread:输出型参数,返回线程ID
attr:设置线程的属性,一般为NULL即可
start_routine:一个函数指针,即线程所要执行的函数,返回值void*,参数void*
arg:传给start_routine的参数。
返回值:创建成功返回0,创建失败返回错误码。


线程等待
为什么要线程等待?
因为已经退出的线程,其空间没有被释放,仍然在进程的地址空间内。如果不进行线程等待,就会发生类似于僵尸进程的问题。所以必须线程等待。

线程等待函数:

int pthread_join(pthread_t thread, void **retval);

thread:线程,表明要等哪个线程
retval:是pthread_create中start_routine的返回值,一般在主线程内定义void*变量,将该变量地址传入,获取start_routine的返回信息。不关心可设为NULL.
返回值:成功返回0,失败返回错误码。

测试样例:

#include <iostream>
#include <unistd.h>
#include <pthread.h>
using namespace std;
void* run1(void*arg)
{const char* msg = (const char*)arg;while(true){cout<<msg<<endl;sleep(1);}
}
void* run2(void*arg)
{const char* msg = (const char*)arg;while(true){cout<<msg<<endl;sleep(1);}
}
int main()
{pthread_t t1,t2;const char* s1 = "I am a thread1";const char* s2 = "I am a thread2";pthread_create(&t1,nullptr,run1,(void*)s1);pthread_create(&t2,nullptr,run2,(void*)s2);pthread_join(t1,nullptr);pthread_join(t2,nullptr);return 0;
}

运行结果
在这里插入图片描述

线程ID和进程ID

进程ID是每一个进程独有的ID,可以通过getpid函数获得,也可以通过 ps -ajx查看属于进程ID,而线程ID是每一个线程独有的ID,当使用pthread_create函数时,通过第一个参数将线程ID传出,也可以使用函数pthread_self

pthread_t pthread_self(void)

无参,返回调用这个函数的线程ID

也可以使用ps -aL查看线程ID

我们创建一个线程并通过pthread_self和ps -aL分别查看它的ID

#include <iostream>
#include <unistd.h>
#include <pthread.h>
using namespace std;
void* run1(void*arg)
{char* msg = (char*)arg;cout<<arg<<pthread_self()<<endl;sleep(1);
}
int main()
{pthread_t t;pthread_create(&t,nullptr,run1,(void*)"pthread id:");pthread_join(t,nullptr);return 0;
}

pthread_self查看的线程ID
在这里插入图片描述

ps -aL查看的线程ID(LWP)
在这里插入图片描述

发现这两个得到的ID是不一样的。pthread_self得到的是非常大的一个数字,ps -aL得到的LWP是比较正常的,这是为什么呢?

答案:LWP得到的线程ID是真正的线程ID。pthread_self得到的这个数实际上是一个地址,在虚拟地址空间上的一个地址,通过这个地址,可以找到关于这个线程的基本信息,包括线程ID,线程栈,寄存器等属性。

注:
在ps -aL得到的线程ID,有一个线程ID和进程ID相同,这个线程就是主线程,主线程的栈在虚拟地址空间的栈上,而其他线程的栈在是在共享区(堆栈之间),因为pthread系列函数都是pthread库提供给我们的。而pthread库是在共享区的。所以除了主线程之外的其他线程的栈都在共享区。


http://chatgpt.dhexx.cn/article/L4IrydkY.shtml

相关文章

Linux-线程(LWP)

文章目录 线程线程概念进程今天的进程 vs之前的进程私有和共享资源实验验证线程的优点&#xff1a;线程的缺点&#xff1a;线程异常线程的用途&#xff1a; 线程控制创建线程(1)先创建两个线程&#xff1a;链接时要引入第三方库。(2)创建多个线程&#xff1a;(3)线程的健壮性不…

护眼色的RGB值 和 颜色代码

在搜索引擎搜“护眼色”&#xff0c;就会搜出一堆关于保护眼睛的屏幕颜色文章&#xff0c;说的统统是一种颜色&#xff0c;有点像绿豆沙的颜色。方法就是在屏幕设置里。 色调: 85; 饱和度: 123; 亮度: 205; R: 199; G: 237; B: 204; 颜色代码是&#xff1a; #…

护眼绿RGB值

网上流行护眼色的RGB值分别为&#xff1a; R: 204 G: 232 B: 207 以matlab R2017b &#xff0c;设置背景色为护眼绿 为例&#xff1a; 预设——>颜色——> 取消勾选 使用系统颜色——> 背景——>RGB——> RGB依次输入 204&#xff0c; 232&#xff0c; 207—…

护眼参数设置

2019独角兽企业重金招聘Python工程师标准>>> 一、护眼背景色参数 柔和的豆沙绿&#xff1a; 色调&#xff1a;85 饱和度&#xff1a;123 亮度&#xff1a;205 对眼睛有益的RGB数值分别是&#xff08;199,237,204&#xff09; 二、eclipse左侧背景色设置 这是跟系统设…

Win10如何设置护眼色

https://blog.csdn.net/xiao297328/article/details/79888156 效果图&#xff1a; 在cmd中输入regedit 重启电脑即可

pdf阅读器修改背景颜色 护眼色

1&#xff0c; pdf and word setting 护眼色 586 3215 1586155 RGB: 170, 207, 184 2&#xff0c; 福昕阅读器设置 3 adobe acrobat

eclipse设置护眼色(一劳永逸)

无需在eclipse中设置&#xff0c;避免切换工作空间后失效。 第一步&#xff1a;首先使用 Win R 组合快捷键&#xff0c;打开“运行”&#xff0c;然后键入打开注册表命令regedit&#xff0c;按回车键确认打开。 第二步&#xff1a;打开注册表之后&#xff0c;依次在左侧树状菜…

vscode调教界面为护眼色

第1步&#xff1a;在vscode上安装主题插件Atom One Light Theme 在扩展商店里输入atom关键词&#xff08;或者直接输入全&#xff09;&#xff0c; 找到如下对应的插件安装并使用 确认使用&#xff08;如果没有更改过快捷键&#xff0c;那么ctrl按住不放&#xff0c;再依次按…

word设置背景色为护眼的绿色

word 2019设置背景色为护眼的绿色 原创不易&#xff0c;路过的各位大佬请点个赞 步骤一 新建一个word空白文档。 步骤二、 依次点开“设计-页面颜色”&#xff0c;选择自己想要的背景色。一般豆沙绿的参数是&#xff1a;红&#xff1a;202&#xff0c;绿&#xff1a;234&…

idea常用护眼色的RGB值调整

1.保护眼睛颜色的RGB数值 银河白 #FFFFFF RGB(255, 255, 255)杏仁黄 #FAF9DE RGB(250, 249, 222)秋叶褐 #FFF2E2 RGB(255, 242, 226)胭脂红 #FDE6E0 RGB(253, 230, 224)青草绿 #E3EDCD RGB(227, 237, 205)海天蓝 #DCE2F1 RGB(220, 226, 241)葛巾…

eclispe 护眼色设置

1.Eclipse字体大小调整&#xff1a; 窗口(Window)-首选项&#xff08;Preferences&#xff09;-> General&#xff09;-> Appearence -> Colors And Fonts -> Java -> Java Editor Text Font -> Change : 2.Eclipse xml和jsp文件字体大小调整&#x…

eclipse 护眼色设置

1 调整eclipse editor区域背景色 背景颜色向你推荐&#xff1a;色调&#xff1a;85。饱和度&#xff1a;1 2 3。亮度&#xff1a;2 0 5 文档都不再是刺眼的白底黑字&#xff0c;而是非常柔和的豆沙绿色&#xff0c;这个色调是眼科专家配置的&#xff0c;长时间使用会很有效的…

idea设置背景护眼色

小伙伴们在敲代码时也要注意保护自己的眼睛哟&#xff0c;今天给大家介绍一种idea设置背景护眼色的办法。 1、打开你的idea&#xff0c;选择“文件”-->“设置”&#xff08;英文版&#xff1a;“File”-->“Settings”&#xff09; 2、点击“编辑器”-->“配色方案”…

护眼色的RGB值

1、对于现代人来说&#xff0c;长时间对着电脑或手机&#xff0c;致使我们的眼睛非常疲惫、干涩&#xff0c;那么设置好电脑的背景色&#xff0c;就会让我们的眼睛得到一定程度的放松&#xff0c;当然更好的办法还是做下眼保健操或走走&#xff0c;眺望下窗外的花草树木等。 网…

网上流行护眼色的RGB值和颜色代码汇总

网上流行护眼色的RGB值和颜色代码 在搜索引擎搜“护眼色”&#xff0c;就会搜出一堆关于保护眼睛的屏幕颜色文章&#xff0c;说的统统是一种颜色&#xff0c;有点像绿豆沙的颜色。方法就是在屏幕设置里&#xff0c; 色调&#xff1a;85&#xff1b;饱和度&#xff1a;123&…

SPI接口的FPGA实现(一)——SPI接口的相关基础知识

SPI系列文章主要介绍SPI接口的一些基础知识&#xff0c;并用DAC芯片81416的配置为例来具体说明SPI接口的具体FPGA实现。 一、SPI的基础 SPI的全称是Serial Peripheral Interface&#xff0c;直译过来就是串行外围接口。一般情况下&#xff0c;FPGA连接各种DAC和ADC&#xff0…

SPI接口原理与时序

SPI接口原理与时序 SPI是串行外设接口&#xff08;Serial Peripheral Interface&#xff09;的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的串行通信总线&#xff0c;并且在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&#xff0c;同时为PCB…

SPI接口的FPGA实现(三)——Verilog代码实现SPI接口

上一篇文章我们介绍了DAC81416的配置过程&#xff0c;这一篇我们就用Verilog代码具体实现这个过程&#xff0c;这一篇的代码具有普遍性&#xff0c;以后所有DA/AD的配置代码都可以在本文所展示的代码上进行修改获得。这里先给出源代码链接和一个通用fifo&#xff08;作为子模块…

FPGA实现的SPI协议(二)----基于SPI接口的FLASH芯片M25P16的使用

写在前面 SPI协议系列文章&#xff1a; FPGA实现的SPI协议&#xff08;一&#xff09;----SPI驱动 FPGA实现的SPI协议&#xff08;二&#xff09;----基于SPI接口的FLASH芯片M25P16的使用 在上篇文章&#xff0c;简要介绍了SPI协议&#xff0c;编写了SPI协议的FPGA驱动&#xf…

SPI接口总结

一、SPI协议【SerialPeripheral Interface】 串行外围设备接口&#xff0c;是一种高速全双工的通信总线。在ADC/LCD等与MCU间通信。 1、SPI信号线 SPI 包含 4 条总线&#xff0c;SPI 总线包含 4 条总线&#xff0c;分别为SS 、SCK、MOSI、MISO。 &#xff08;1&#xff09;SS…