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

Linux - 什么是线程和线程的操作

线程概念

什么是线程: 

线程(Thread)是操作系统能够进行运算调度的最小单位. 它被包含在进程之中, 是进程中的实际运作单位. 一个进程可以包含多个线程.

进程 : 线程 == 1 : n (n >= 1).

进程是系统分配资源的基本单位.

线程则是系统调度的基本单位.

在 Linux 中, 线程又被称为轻量级进程. 因为线程不必再进行空间的分配. 只需要对新创建的线程进行初始化 (创建线程的PCB即可).

 可以看到, 如果要新建线程, 只需要创建相应的 线程控制块(TCB) 即可, TCB 和 PCB中的内容非常相近.

在 Linux 中是没有单独实现线程的. Linux 中的线程都是通过进程来实现的.

所以在 Linux 实际上是没有线程的, 站在调度的视角来看, 调度的都是进程不存在线程.

线程与进程区别

1. 进程是系统资源分配的基本单位

2. 线程是系统调度的基本单位

虽然线程共享进程的资源, 但是每个进程也都会有只属于自己的数据和资源.

  • 线程ID
  • 每个线程都有独属于自己的栈空间
  • 既然线程是调度的基本单位,那每个线程的调度优先级也有可能是不同的

线程共享的如: 代码段, 全局变量, 信号的处理 ....

可以使用指令: ps -L. 来查看所有的进程和线程

LWP 就是线程ID. PID 和 LWP 相同的线程就是这个进程的主线程

PID 相同的线程则属于同一个进程.

如何操作线程

上面提到了, Linux 系统本身没有为线程单独实现, 但是提供了一个第三方库: <pthread>.
使用 <pthread> 库就能在 Linux 下完成线程的操作.

因为这个库是第三方库, 所以在使用时, 使用G++编译时需要加入选项 "-lpthread"

g++ -o text.exe test.cpp -lpthread

创建线程

了解 pthread_create 函数: 

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg);
// thread:指向 pthread_t 类型的指针, 用于存储新创建的线程ID.
// attr:指向 pthread_attr_t 类型的指针, 用于设置线程属性. 通常传 NULL 表示使用默认属性.
// start_routine:线程函数的指针.
// arg:传递给线程函数的参数.

创建线程的例子: 

#include<pthread.h>
void* func(void* args)
{printf("thread func running\n");return NULL;
}
int main()
{pthread_t thread; // 用来记录创建出来的线程的线程IDret = pthread_create(&thread, NULL, func, NULL); // 创建线程if(ret != 0){perror("创建线程失败");return 1;}pthread_join(thread, NULL); // 和进程一样, 创建了子进程后, 需要等待子进程结束// 这里同样需要等待线程结束return 0;
}

在上面的代码中, 将线程创建出来后, 线程就会独立的去运行 func 函数, 当 func 函数结束时, 线程也同样结束了. 线程只会运行传给他的函数.

线程终止

1. return 返回

在上面的例子中, 我们等待创建出来的线程运行到末尾, 执行 return 语句.

执行完 return 语句后, 线程就结束了.

2. 使用函数 pthread_exit()

pthread_exit 函数可以立即终止当前线程, 并返回指定的值.

#include<pthread.h>
void* func(void* arg)
{printf("thread is running\n");pthread_exit(); // 线程执行这一句后, 本线程就会被终止printf("no running\n");
}

3. 使用 pthread_cancel() 函数

void* func(void* arg)
{}
int main() 
{pthread_t thread;if (pthread_create(&thread, NULL, func, NULL) != 0) {perror("pthread_create");return 1;}// 请求终止线程if (pthread_cancel(thread) != 0) // 将线程的 ID 传给函数{perror("pthread_cancel");return 1;}return 0;
}

以上三种方法在线程终止后, 都可以通过 pthread_join() 函数进行线程等待.

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

  • thread:要等待的线程的 ID. 这个 ID 是通过 pthread_create 函数创建线程时返回的.

  • retval:指向 void * 类型的指针, 用于存储线程函数的返回值. 如果不需要获取线程的返回值, 可以传 NULL.

pthread_join() 等待线程终止后, 会自动释放线程的资源. 如果线程没有被等待, 其资源会在线程终止时自动释放, 但可能会导致资源泄漏.

线程分离

如果我们并不关心线程的运行情况, 我们也可以选择不进行线程等待, 这个线程在运行结束后, 就会自动释放资源, 不需要我们调用 pthread_join() 函数. 

我们需要将线程设置为分离状态, 这样主线程就不用调用 pthread_join().

int pthread_detach(pthread_t thread);

#include <pthread.h>void* thread_function(void* arg)
{// 线程要执行的代码printf("Thread function is running.\n");return NULL;
}int main()
{pthread_t thread;// 创建线程if (pthread_create(&thread, NULL, thread_function, NULL) != 0){perror("pthread_create");return 1;}// 将线程设置为分离状态if (pthread_detach(thread) != 0){perror("pthread_detach");return 1;}// 主线程继续执行printf("Main thread is running.\n");// 将上面创建的线程设置为分离状态后, 就不用调用 pthread_join 函数.return 0;
}

线程优缺点

  • 优点

    • 提高程序的响应性和并行处理能力
    • 共享内存, 减少资源开销
    • 轻量级, 调度开销小
    • 适合细粒度的并发任务
  • 缺点

    • 数据竞争和同步问题复杂
    • 容易发生死锁, 难以检测和解决
    • 线程管理开销, 创建和销毁线程消耗资源
    • 优先级问题, 可能导致优先级倒置和调度不公平

相关文章:

Linux - 什么是线程和线程的操作

线程概念 什么是线程: 线程&#xff08;Thread&#xff09;是操作系统能够进行运算调度的最小单位. 它被包含在进程之中, 是进程中的实际运作单位. 一个进程可以包含多个线程. 进程 : 线程 1 : n (n > 1). 进程是系统分配资源的基本单位. 线程则是系统调度的基本单位. 在…...

windows及linux 安装 Yarn 4.x 版本

1. 确保系统环境准备 a. 安装 Node.js Yarn 依赖于 Node.js,所以需要先安装 Node.js。前往 Node.js 官网 下载并安装适合你的 Windows 版本的 Node.js(推荐 LTS 版本)。安装完成后,打开命令提示符(CMD)或 PowerShell,验证安装:node -v npm -v如果显示版本号,则表示安…...

如何设计一个 RPC 框架?需要考虑哪些点?

面试官&#xff1a;如何设计一个 RPC 框架&#xff1f;需要考虑哪些点&#xff1f; 设计一个远程过程调用&#xff08;RPC&#xff09;框架是一个复杂的系统工程&#xff0c;涉及多个方面的考虑。一个好的 RPC 框架应具备可扩展性、灵活性、易用性和高性能。下面是设计 RPC 框…...

初学stm32 --- DAC输出三角波和正弦波

输出三角波实验简要&#xff1a; 1&#xff0c;功能描述 通过DAC1通道1(PA4)输出三角波&#xff0c;然后通过DS100示波器查看波形 2&#xff0c;关闭通道1触发(即自动) TEN1位置0 3&#xff0c;关闭输出缓冲 BOFF1位置1 4&#xff0c;使用12位右对齐模式 将数字量写入DAC_…...

开源cJson用法

cJSON cJSON是一个使用C语言编写的JSON数据解析器&#xff0c;具有超轻便&#xff0c;可移植&#xff0c;单文件的特点&#xff0c;使用MIT开源协议。 cJSON项目托管在Github上&#xff0c;仓库地址如下&#xff1a; https://github.com/DaveGamble/cJSON 使用Git命令将其拉…...

【学习笔记】理解深度学习和机器学习的数学基础:数值计算

深度学习作为人工智能领域的一个重要分支&#xff0c;其算法的实现和优化离不开数值计算。数值计算在深度学习中扮演着至关重要的角色&#xff0c;它涉及到如何在计算机上高效、准确地解决数学问题。本文将介绍深度学习中数值计算的一些关键概念和挑战&#xff0c;以及如何应对…...

如何使用CSS让页面文本两行显示,超出省略号表示

talk is cheap, show me the code 举个栗子&#xff0c;如下&#xff1a; <span class"a">我说说<b class"b">打瞌睡党风建设打火机</b>说说色儿</span>a{display:block/inline-block;width:100px;overflow: hidden; white-spac…...

likeshop同城跑腿系统likeshop回收租赁系统likeshop多商户商城安装及小程序对接方法

前言&#xff1a;首先likeshop是一个开发平台&#xff0c;是一个独创的平台就像TP内核平台一样&#xff0c;你可以在这个平台上开发和衍生出很多伟大的产品&#xff0c;以likeshop为例&#xff0c;他们开发出商城系统&#xff0c;团购系统&#xff0c;外卖点餐系统&#xff0c;…...

C# 与 Windows API 交互的“秘密武器”:结构体和联合体

一、引言 在 C# 的编程世界里&#xff0c;当我们想要深入挖掘 Windows 系统的底层功能&#xff0c;与 Windows API 打交道时&#xff0c;结构体和联合体就像是两把神奇的钥匙&#x1f511; 它们能够帮助我们精准地操控数据&#xff0c;实现一些高级且强大的功能。就好比搭建一…...

PHP 使用 Redis

PHP 使用 Redis PHP 是一种广泛使用的服务器端编程语言,而 Redis 是一个高性能的键值对存储系统。将 PHP 与 Redis 结合使用,可以为 Web 应用程序提供快速的读写性能和丰富的数据结构。本文将详细介绍如何在 PHP 中使用 Redis,包括安装、连接、基本操作以及一些高级应用。 …...

嵌入式系统Linux实时化(四)Xenomai应用开发测试

1、Xenomai 原生API 任务管理 Xenomai 本身提供的一系列多任务调度机制,主要有以下一些函数: int rt_task_create (RT_TASK task, const char name, int stksize, int prio, intmode) ; 任务的创建;int rt_task_start(RT_TASK task, void(entry)(void cookie), void cookie…...

26个开源Agent开发框架调研总结(2)

根据Markets & Markets的预测&#xff0c;到2030年&#xff0c;AI Agent的市场规模将从2024年的50亿美元激增至470亿美元&#xff0c;年均复合增长率为44.8%。 Gartner预计到2028年&#xff0c;至少15%的日常工作决策将由AI Agent自主完成&#xff0c;AI Agent在企业应用中…...

Element UI与Element Plus:深度剖析

文章目录 前言一、概述二、技术特性三、设计理念四、使用体验五、迁移指南结语 前言 随着前端开发技术的快速发展&#xff0c;Vue.js 生态系统中的组件库也在不断进化。Element UI 和 Element Plus 是两个深受开发者喜爱的 Vue 组件库&#xff0c;它们分别构建于 Vue 2.x 和 V…...

二、BIO、NIO编程与直接内存、零拷贝

一、网络通信 1、什么是socket&#xff1f; Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层&#xff0c;它是一组接口&#xff0c;一般由操作 系统提供。客户端连接上一个服务端&#xff0c;就会在客户端中产生一个 socket 接口实例&#xff0c;服务端每接受 一个客户端…...

VSCode 更好用的设置

配置 {"terminal.integrated.fontSize": 15,"security.workspace.trust.untrustedFiles": "open","editor.minimap.enabled": false,"workbench.colorTheme": "Visual Studio 2017 Light - C","gnuGlobal.c…...

【git】-3 github创建远程仓库,上传自己的项目,下载别人的项目

一、如何使用Github 1、创建远程仓库 2、使用github拉取/推送代码 克隆仓库 向远程仓库推送代码-git push 二、上传我们自己的项目到github 方法一&#xff1a;直接上传 方法二&#xff1a;使用git命令 方法三&#xff1a; 将仓库拉取到本地上传 三、下载别人的项目 …...

计算机组成原理(1)

系统概述 计算机硬件基本组成早期冯诺依曼机现代计算机 计算机各部分工作原理主存储器运算器控制器计算机工作过程 此文章的图片资源获取来自于王道考研 计算机硬件基本组成 早期冯诺依曼机 存储程序是指将指令以二进制的形式事先输入到计算机的主存储器&#xff0c;然后按照…...

Openstack网络组件之Neutron

从Nova到Neutron&#xff1a;OpenStack网络架构的演变 在云计算和虚拟化技术迅猛发展的背景下&#xff0c;OpenStack 成为了构建私有云和公有云平台的首选解决方案之一。早期版本中&#xff0c;Nova 项目不仅负责计算资源的管理&#xff0c;还承担了提供基本网络连接的任务。然…...

神州数码交换机和路由器命令总结

神州数码交换机和路由器命令总结 一、神州数码交换机命令总结 1. 交换机恢复出厂设置及其基本配置. 1) //进入特权模式 2) del startup.cfg 2. Telnet方式管理交换机. 1) //进入全局配置模式 2) enable password 0 [密码] 3) Line 0 4 4) Password 0 [密码] 5) Login 3. 交换机…...

Spring MVC简单数据绑定

【图书介绍】《SpringSpring MVCMyBatis从零开始学&#xff08;视频教学版&#xff09;&#xff08;第3版&#xff09;》_springspringmvcmybatis从零开始 代码、课件、教学视频与相关软件包下载-CSDN博客 《SpringSpring MVCMyBatis从零开始学(视频教学版)&#xff08;第3版&…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献

Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译&#xff1a; ### 胃肠道癌症的发病率呈上升趋势&#xff0c;且有年轻化倾向&#xff08;Bray等人&#xff0c;2018&#x…...

EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势

一、WebRTC与智能硬件整合趋势​ 随着物联网和实时通信需求的爆发式增长&#xff0c;WebRTC作为开源实时通信技术&#xff0c;为浏览器与移动应用提供免插件的音视频通信能力&#xff0c;在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能&#xff0c;对实时…...