Uinx线程详解
目录
一.什么是线程?
并发(Concurrency)
并行(Parallelism)
1.1 线程的概念
1.2 线程的基本函数
1.3 线程的基本使用例子:
二.线程的属性
2.1线程属性使用例子
三.线程互斥
3.1互斥锁
3.2互斥锁常用函数
3.3互斥锁使用例子
一.什么是线程?
在Linux中,线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。同一进程中的多条线程将共享该进程所拥有的全部资源,但每条线程都有各自的调用栈和程序计数器,能够独立运行。
那么什么是并发与并行呢?
并发(Concurrency)
并发是指系统能够处理多个同时发生的任务。在并发编程中,多个任务在同一时间段内执行,但它们可能不是同时执行。并发可以通过时间分片(time slicing)来实现,操作系统快速地在多个任务之间切换,给人一种同时执行的错觉。
并发的主要目的是提高资源的利用率和系统的响应速度。例如,在一个Web服务器中,可以同时处理多个用户的请求,这样就可以更有效地利用服务器的资源,并缩短用户的等待时间。
并行(Parallelism)
并行是指系统能够在同一时刻执行多个任务。并行编程需要多个处理器或者多个核心,每个处理器或核心可以独立地执行一个任务。并行是真正的“同时”执行,它通过增加计算资源来提高性能。
并行的主要目的是通过同时执行多个任务来提高性能和缩短任务的完成时间。例如,在一个多核处理器上,可以同时运行多个线程或者进程,这样可以显著减少执行复杂计算或者数据处理任务所需的时间。
1.1 线程的概念
- 轻量级进程(Lightweight Process, LWP):线程又被称为轻量级进程,因为线程的创建、撤销和切换比进程更快。
- 线程的属性:线程具有就绪、阻塞和运行三种基本状态,以及创建和终止两种辅助状态。
- 线程的执行:线程可以并发执行,这意味着它们似乎是在同时运行,但实际上是在CPU时间片轮转机制下快速切换执行。
如何使用线程:
在Linux中,线程可以通过 POSIX 线程(pthread)库来使用。这个库提供了一系列函数来创建、同步和管理线程。
线程共享资源
1.文件描述符表
2.每种信号的处理方式
3.当前工作目录
4.用户ID和组ID
5.内存地址空间 (.text/.data/.bss/heap/共享库)
线程非共享资源1.线程id
2.处理器现场和栈指针(内核栈)
3.独立的栈空间(用户空间栈)
4.errno变量
5.信号屏蔽字
6.调度优先级线程优、缺点
- 优点: 1. 提高程序并发性 2. 开销小 3. 数据通信、共享数据方便
- 缺点: 1. 库函数,不稳定 2. 调试、编写困难、gdb不支持 3. 对信号支持不好
- 优点相对突出,缺点均不是硬伤。Linux下由于实现方法导致进程、线程差别不是很大。
1.2 线程的基本函数
基本函数介绍和使用:
线程创建:
pthread_create
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
thread
:指向线程标识符的指针。attr
:线程属性,通常设为NULL
表示使用默认属性。start_routine
:线程运行函数的起始地址。arg
:运行函数的参数。线程终止:
pthread_exit
void pthread_exit(void *retval);
retval
:线程的返回值。等待线程终止:
pthread_join
int pthread_join(pthread_t thread, void **retval);
thread
:等待终止的线程标识符。retval
:存储线程返回值的指针。线程取消:
pthread_cancel
int pthread_cancel(pthread_t thread);
thread
:要取消的线程标识符。线程互斥锁:
pthread_mutex_lock/unlock
int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_unlock(pthread_mutex_t *mutex);
mutex
:互斥锁变量,用于同步线程对共享资源的访问。
1.3 线程的基本使用例子:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>// 线程运行函数
void *print_message_function(void *ptr) {char *message;message = (char *) ptr;printf("%s \n", message);return NULL;
}int main() {pthread_t thread1, thread2;char *message1 = "Thread 1";char *message2 = "Thread 2";// 创建线程1if(pthread_create(&thread1, NULL, print_message_function, (void*) message1)) {printf("Error creating thread 1\n");return 1;}// 创建线程2if(pthread_create(&thread2, NULL, print_message_function, (void*) message2)) {printf("Error creating thread 2\n");return 1;}// 等待线程终止if(pthread_join(thread1, NULL)) {printf("Error joining thread 1\n");return 2;}if(pthread_join(thread2, NULL)) {printf("Error joining thread 2\n");return 2;}return 0;
}
在这个例子中:
- 定义了一个
print_message_function
函数,它接收一个指向字符数组的指针,并打印出来。- 在
main
函数中,创建了两个线程thread1
和thread2
,它们都执行print_message_function
函数,但分别传递了不同的消息。- 使用
pthread_create
创建线程,使用pthread_join
等待线程结束。程序执行时,会创建两个线程,它们可能会并发地运行,打印出各自的消息。使用
pthread_join
确保了主程序会等待这两个线程完成它们的任务后再退出。
二.线程的属性
线程属性(Thread Attributes)是可以用来定制线程的各种特性的集合。在创建线程时,可以指定线程的属性,如果不指定,线程会使用默认属性。线程属性通过
pthread_attr_t
结构体来表示,并且在使用前需要初始化。常见的线程属性包括:
- detachstate:线程的分离状态属性,可以设置为
PTHREAD_CREATE_JOINABLE
(默认值,可以调用pthread_join
来等待线程结束)或PTHREAD_CREATE_DETACHED
(线程一旦结束,其资源立即被回收,不能被等待)。- schedpolicy:线程的调度策略,可以是
SCHED_OTHER
(默认值,普通轮转调度),SCHED_FIFO
(先来先服务调度),或SCHED_RR
(时间片轮转调度)。- inheritsched:线程的继承调度策略,可以设置为
PTHREAD_EXPLICIT_SCHED
(显式指定线程的调度属性)或PTHREAD_INHERIT_SCHED
(继承创建它的线程的调度属性,默认值)。- scope:线程的作用域,可以设置为
PTHREAD_SCOPE_SYSTEM
(与系统范围内的线程竞争CPU时间)或PTHREAD_SCOPE_PROCESS
(仅与同一进程内的线程竞争CPU时间,通常是默认值)。
2.1线程属性使用例子
#include <pthread.h>int main() {pthread_attr_t attr;pthread_attr_init(&attr); // 初始化线程属性// 设置线程为分离状态pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);// 使用线程属性创建线程pthread_t thread;pthread_create(&thread, &attr, thread_function, NULL);// 清理线程属性pthread_attr_destroy(&attr);// ... 其他代码 ...return 0;
}
三.线程互斥
3.1互斥锁
互斥锁(Mutex):
互斥锁是一种同步机制,用于防止多个线程同时访问共享资源。在多线程环境中,当多个线程尝试同时访问同一资源时,互斥锁确保任何时刻只有一个线程能够访问该资源。
3.2互斥锁常用函数
常用的互斥锁函数:
初始化互斥锁:
pthread_mutex_init
c
复制
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
mutex
:指向互斥锁变量的指针。attr
:互斥锁属性,通常设为NULL
表示使用默认属性。锁定互斥锁:
pthread_mutex_lock
c
复制
int pthread_mutex_lock(pthread_mutex_t *mutex);
mutex
:指向互斥锁变量的指针。尝试锁定互斥锁:
pthread_mutex_trylock
c
复制
int pthread_mutex_trylock(pthread_mutex_t *mutex);
mutex
:指向互斥锁变量的指针。如果互斥锁已经被锁定,函数不会阻塞,而是返回错误码。解锁互斥锁:
pthread_mutex_unlock
c
复制
int pthread_mutex_unlock(pthread_mutex_t *mutex);
mutex
:指向互斥锁变量的指针。销毁互斥锁:
pthread_mutex_destroy
c
复制
int pthread_mutex_destroy(pthread_mutex_t *mutex);
mutex
:指向互斥锁变量的指针。
3.3互斥锁使用例子
#include <pthread.h>// 全局变量
pthread_mutex_t lock; // 互斥锁
int shared_data = 0; // 共享数据// 线程函数
void *thread_function(void *arg) {pthread_mutex_lock(&lock); // 加锁shared_data++; // 访问共享数据pthread_mutex_unlock(&lock); // 解锁return NULL;
}int main() {pthread_mutex_init(&lock, NULL); // 初始化互斥锁pthread_t threads[10];for(int i = 0; i < 10; i++) {pthread_create(&threads[i], NULL, thread_function, NULL); // 创建线程}for(int i = 0; i < 10; i++) {pthread_join(threads[i], NULL); // 等待线程结束}pthread_mutex_destroy(&lock); // 销毁互斥锁printf("Shared data: %d\n", shared_data); // 输出共享数据的最终值return 0;
}
在这个例子中,我们创建了一个互斥锁
lock
来保护对shared_data
的访问。每个线程在访问shared_data
之前都会尝试锁定互斥锁,完成访问后解锁。这样可以确保在任一时刻只有一个。
相关文章:
Uinx线程详解
目录 一.什么是线程? 并发(Concurrency) 并行(Parallelism) 1.1 线程的概念 1.2 线程的基本函数 1.3 线程的基本使用例子: 二.线程的属性 2.1线程属性使用例子 三.线程互斥 3.1互斥锁 3.2互斥锁常用函…...
线性代数笔记23--马尔可夫矩阵、傅里叶级数
1. 马尔可夫矩阵 例子 A [ . 1 . 001 . 3 . 2 . 099 . 3 . 7 0 . 4 ] A \begin{bmatrix} .1 & .001 & .3\\ .2 & .099 & .3\\ .7 & 0 & .4 \end{bmatrix} A .1.2.7.001.0990.3.3.4 马尔可夫矩阵满足条件 λ 1 为特征值 \lambda1为特征…...
Elasticsearch 压测实践总结
背景 搜索、ES运维场景离不开压力测试。 1.宿主机层面变更:参数调优 & 配置调整 & 硬件升级2.集群层面变更:参数调优3.索引层面变更:mapping调整 当然还有使用层面变更,使用API调优(不属于该文章的讨论范围…...
Spirngboot JWT快速配置和使用
2、JWT 2.1、JWT介绍 JWT是JSON Web Token的缩写,即JSON Web令牌,是一种自包含令牌。 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。 JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从…...
【Java SE】继承
🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. 继承1.1 继承是什么1.2 继承的意义1.3 继承的语法1.4 继承的方式1.5 子类中访问父类成员1.5.1 子类中访问…...
设计模式(19):策略模式
策略模式 策略模式对应与解决某一个问题的一个算法族,允许用户从该算法族中任选一个算法解决某一问题,同时可以方便的更换算法或者增加新的算法。并且由客户端决定调用哪个算法。 本质 分离算法,选择实现; 策略模式角色 上下…...
Linux 命令 top 详解
1 top命令介绍 Linux系统中,Top命令主要用于实时运行系统的监控,包括Linux内核管理的进程或者线程的资源占用情况。这个命令对所有正在运行的进程和系统负荷提供不断更新的概览信息,包括系统负载、CPU利用分布情况、内存使用、每个进程的内容…...
Android安卓开发 - 简单介绍(一)
最近呢需要重构还有维护安卓项目,所以最近会从零开始梳理开发的一些知识点以及开发的内容 前面已经写了安装的教程,idea怎么安装,还有官方的开发工具Android Studio怎么安装 2024最新版Android studio安装入门教程(非常详细&…...
AJAX —— 学习(二)
目录 一、利用 JSON 字符串 返回数据 (一)基础代码 (二)原理及实现 二、nodmon 工具 自动重启服务 (一)用途 (二)下载 (三)使用 三、IE 缓存问题 &a…...
CSC博士联培申请时间线
暂时只记得这么多了,有问题会及时修改。 #mermaid-svg-ZMjY9etaS7StCVuw {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ZMjY9etaS7StCVuw .error-icon{fill:#552222;}#mermaid-svg-ZMjY9etaS7StCVuw .e…...
大数据实验三-HBase编程实践
目录 一.实验内容 二.实验目的 三.实验过程截图及说明 1、安装HBase 2、配置伪分布式模式: 3、使用hbase的shell命令来操作表: 4、使用hbase提供的javaAPI来编程实现类似操作: 5、实验总结及心得体会…...
【Python】Pillow支持的图像文件格式
完全支持格式只读格式只写格式仅标识格式BLPCURPALMBUFRBMPDCXPDFGRIBDDSFITSXV ThumbnailsHDF5DIBFLCMPEGEPSFPXGIFFTEXICNSGBRICOGDIMIMTJPEGIPTC/NAAJPEG 2000MCIDASMSPMICPCXMPOPNGPCDPPMPIXARSGIPSDSPIDERQOITGASUNTIFFWALwebpWMF、EMFXBMXPM 参考文献 图像文件格式 - P…...
算法——最小生成树
Prim算法: 算法步骤: 1.选择一个起始节点作为最小生成树的起点。 2.将该起始节点加入最小生成树集合,并将其标记为已访问。 3.在所有与最小生成树集合相邻的边中,选择权重最小的边和它连接的未访问节点。 4.将该边和节点加入最小…...
OpenHarmony相机和媒体库-如何在ArkTS中调用相机拍照和录像。
介绍 此Demo展示如何在ArkTS中调用相机拍照和录像,以及如何使用媒体库接口进行媒体文件的增、删、改、查操作。 本示例用到了权限管理能力ohos.abilityAccessCtrl 相机模块能力接口ohos.multimedia.camera 图片处理接口ohos.multimedia.image 音视频相关媒体业…...
【EasyExcel】多sheet、追加列
业务-EasyExcel多sheet、追加列 背景 最近接到一个导出Excel的业务,需求就是多sheet,每个sheet导出不同结构,第一个sheet里面能够根据最后一列动态的追加列,追加多少得看运营人员传了多少需求列。原本使用的 pig4cloud 架子&…...
韩顺平 | 零基础快速学Python
环境准备 开发工具:IDLE、Pycharm、Sublime Text、Eric 、文本编辑器(记事本/editplus/notepad) Python特点:既支持面向过程OOP、也支持面向对象编程;具有解释性,不需要编程二进制代码,可以直…...
docker部署DOS游戏
下载镜像 docker pull registry.cn-beijing.aliyuncs.com/wuxingge123/dosgame-web-docker:latestdocker-compose部署 vim docker-compose.yml version: 3 services:dosgame:container_name: dosgameimage: registry.cn-beijing.aliyuncs.com/wuxingge123/dosgame-web-docke…...
基于单片机的无线红外报警系统
**单片机设计介绍,基于单片机的无线红外报警系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的无线红外报警系统是一种结合了单片机控制技术和无线红外传感技术的安防系统。该系统通过无线红外传感器实…...
【JAVAEE学习】探究Java中多线程的使用和重点及考点
˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…...
Day81:服务攻防-开发框架安全SpringBootStruts2LaravelThinkPHPCVE复现
目录 PHP-框架安全-Thinkphp&Laravel Laravel CVE-2021-3129 RCE Thinkphp 版本3.X RCE-6.X RCE 版本6.X lang RCE J2EE-框架安全-SpringBoot&Struts2 Struct2 旧漏洞(CVE-2016-0785等) struts2 代码执行 (CVE-2020-17530)s2-061 Str…...
.kat6.l6st6r勒索病毒肆虐,这些应对策略或许能帮到你
引言: 近年来,网络安全问题日益凸显,其中勒索病毒更是成为了公众关注的焦点。其中,.kat6.l6st6r勒索病毒以其独特的传播方式和破坏力,给全球用户带来了极大的困扰。本文将深入探讨.kat6.l6st6r勒索病毒的特点…...
maya移除节点 修改节点
目录 maya移除节点 使用 Maya 用户界面: 使用脚本: maya 修改节点名字 使用 Maya 用户界面: 使用 MEL 脚本: 使用 Python 脚本: 注意事项: maya移除节点 使用 Maya 用户界面: 在“层次…...
嵌入式算法开发系列之卡尔曼滤波算法
卡尔曼滤波算法 文章目录 卡尔曼滤波算法前言一、卡尔曼滤波算法原理二、算法应用三、C语言实现总结 前言 在嵌入式系统中,传感器数据通常受到噪声、误差和不确定性的影响,因此需要一种有效的方法来估计系统的状态。卡尔曼滤波算法是一种基于概率理论的…...
简述对css工程化的理解
一、css工程化解决了哪些问题 1、宏观设计:css如何组织、拆分、设计模块结构 2、编码优化:如何更好地编写css 3、构建:如何处理css,使打包结果最优 4、可维护性:最小化后续的变更成本 二、针对问题,如何解…...
.NET 5种线程安全集合
在.NET中,有许多种线程安全的集合类,下面介绍五种我们常用的线程安全集合以及他们的基本用法。 ConcurrentBag ConcurrentBag 是一个线程安全的无序包。它适用于在多线程环境中频繁添加和移除元素的情况。 ConcurrentBag<int> concurrentBag n…...
计算机信息自查
文章目录 操作系统安装时间硬盘序列号查询上网IPMAC地址 操作系统安装时间 可以使用命令行形式,查询windows系统安装时间: wmic OS get InstallDate首先显示年份,然后是月份,然后是日期,然后是安装的确切时间 或者w…...
配置vite配置文件更改项目端口、使用@别名
一、配置vite配置文件更改项目端口 vite官方文档地址:开发服务器选项 | Vite 官方中文文档 (vitejs.dev) 使用: 二、使用别名 1. 安装 types/node types/node 包允许您在TypeScript项目中使用Node.js的核心模块和API,并提供了对它们的类型…...
【LeetCode热题100】【链表】环形链表
题目链接:141. 环形链表 - 力扣(LeetCode) 判断一个链表有没有环可以用快慢指针的方法,如果没有环,那么最终可以让两个指针中一个为空,如果有环,那么快指针终会与慢指针相遇 class Solution {…...
SpringBoot整合ELK8.1.x实现日志中心教程
目录 背景 环境准备 环境安装 1.JDK安装 2.安装Elasticsearch 3.安装zookeeper 4.安装Kafka 5.安装logstash 6.安装file beat 解决方案场景 1.日志采集 1.1 应用日志配置 1.1.1 创建logback-spring.xml文件 1.1.2 创建LoggerFactory 1.1.3 trace日志的记录用法 …...
计算机网络:数据链路层 - 封装成帧 透明传输 差错检测
计算机网络:数据链路层 - 封装成帧 & 透明传输 & 差错检测 数据链路层概述封装成帧透明传输差错检测 数据链路层概述 从数据链路层来看,主机 H1 到 H2 的通信可以看成是在四段不同的链路上的通信组成的,所谓链路就是从一个节点到相邻…...
买了域名后怎么建网站/竞价网络推广培训
当使用Qt进行开发时,qmake是一个非常常见的构建工具,可以通过一个简单的文本文件(.pro)来自动生成Makefiles文件,并将您需要的库和依赖项连接到最终生成的二进制文件中。以下是一些常见的、适用于初级程序员的qmake规则: SOURCES:…...
百度给企业做网站吗/免费网站软件推荐
HDMI框架层控制部分别在两个部分: frameworks/base/core/java/android/hardware/hdmi frameworks/base/services/core/java/com/android/server/hdmi 如果平台是MTK的, 有会一个frameworks/base/services/core/java/com/mediatek/hdmi/MtkHdmiManager…...
网站制作课题组/nba最新交易汇总
本机的orcl 没装好,但是sqlplus可以用,想连接远程的数据库服务器,研究一下sqlplus使用 首先使用dba权限登录: 命令:sqlplus 用户名/密码ip地址[:端口]/service_name [as sysdba] 示例:sqlplus sys/sys192.168.0.254:…...
网站建设客户说没用/浏览器打开网站
在vue项目总会有这样一功能,在页面中显示最新的实时事件,如图展示: 在html部分,vue里也就是< template>定义一个div<div class "time">{{date}}</div> 复制代码在< script>方法部分export defa…...
南通物流网站建设/网络营销文案实例
URL即:统一资源定位符 (Uniform Resource Locator, URL) 完整的URL由这几个部分构成: scheme://host:port/path?query#fragment scheme:通信协议 常用的http,ftp,maito等 host:主机 服务器(计算机)域名系统 (DNS) 主机名或 IP 地址。 port:端口号 整数,…...
多版本wordpress/游戏代理平台一天结一次
VB.NET中对象的克隆 侯永锋 在3DMAX里面,做好一个物体(父物体)以后,可以选择Edit菜单中的Clone,下面有三中选项:Copy(生成一个同模样的子物体,两者的操作互不影响)&#…...