Linux开发讲课33---线程实现与线程控制步骤简析

线程概述

进程是系统中程序执行和资源分配的基本单位。

每个进程都拥有自己的数据段、代码段和堆栈段,这就造成了进程在进行切换等操作时都需要有比较负责的上下文切换等动作。为了进一步减少处理机的空转时间支持多处理器和减少上下文切换开销,进程在演化中出现了另一个概念——线程。它是一个进程内的基本调度单位,也可以称为轻量级进程。

线程是在共享内存空间中并发的多道执行路径,它们共享一个进程的资源,如文件描述和信号处理。因此,大大减少了上下文切换的开销。

同进程一样,线程也将相关的变量值放在线程控制表内TCB。

一个进程可以有多个线程,也就是有多个线程控制表及堆栈寄存器,但却共享一个用户地址空间。

要注意的是,由于线程共享了进程的资源和地址空间,因此,任何线程对系统资源的操作都会给其他线程带来影响,因此,多线程中的同步就是非常重要的问题了。
在多线程系统中,进程与线程的关系如图
Linux线程实现
 
1.线程创建和退出
 
(1)函数说明
线程创建:pthread_create。
 
线程退出:
 
(1)在线程创建以后,就开始运行相关的线程函数,在该函数运行完之后,该线程也就退出了,这也是线程退出一种方法。
 
(2)另一种退出线程的方法是使用函数 pthread_exit。由于 exit 的作用是使调用进程终止,往往一个进程包含多个线程,因此,在使用 exit 之后,该进程中的所有线程都终止了。因此,在线程中就可以使用 pthread_exit 来代替进程中的 exit。
 
线程退出之后,退出线程所占用的资源并不会随着线程的终止而得到释放。
 
pthread_join()函数。pthread_join 可以用于将当前线程挂起,等待线程的结束。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源就被收回。
​​​​​​​
​​​​​​​        
以下实例中创建了两个线程,其中第一个线程是在程序运行到中途时调用 pthread_exit函数退出,第二个线程正常运行退出。在主线程中收集这两个线程的退出信息,并释放资源。从这个实例中可以看出,这两个线程是并发运行的。
 
gcc -o th th.c -lpthread (编译的时候要加入线程库)
 
由于线程共享进程的资源和地址空间,因此在对这些资源进行操作时,必须考虑到线程间资源访问的惟一性问题,这里主要介绍 POSIX 中线程同步的方法,主要有互斥锁和信号量的方式。
 
2.mutex 互斥锁线程控制
(1)函数说明
mutex是一种简单的加锁的方法来控制对共享资源的存取。
这个互斥锁只有两种状态,也就是上锁和解锁。
 
可以把互斥锁看作某种意义上的全局变量。在同一时刻只能有一个线程掌握某个互斥上的锁,拥有上锁状态的线程能够对共享资源进行操作。若其他线程希望上锁一个已经上锁了的互斥锁,则该线程就会挂起,直到上锁的线程释放掉互斥锁为止。可以说,这把互斥锁使得共享资源按序在各个线程中操作。
 
互斥锁初始化:pthread_mutex_init
互斥锁上锁:pthread_mutex_lock—阻塞
互斥锁判断上锁:pthread_mutex_trylock —非阻塞(如果已经上锁,则返回EBUSY;如果没上锁,则给它上锁,成功为0,不成功为其他值)
互斥锁解锁:pthread_mutex_unlock
消除互斥锁:pthread_mutex_destroy
 
互斥锁可以分为:
 
快速锁:指调用线程会阻塞直至拥有互斥锁的线程解锁为止。
递归互斥锁:能够成功地返回并且增加调用线程在互斥上加锁的次数.
检错互斥锁:则为快速互斥锁的非阻塞版本,它会立即返回并返回一个错误信息。
3.信号量线程控制
(1)信号量说明
信号量也就是操作系统中所用到的 PV 原语,它广泛用于进程或线程间的同步与互斥,它本质上是一个非负的整数计数器。
 
PV 原语是对整数计数器信号量 sem 的操作。一次 P 操作使 sem 减一(分配资源),而一次 V 操作使sem 加一(释放资源)。
 
进程(或线程)根据信号量的值来判断是否对公共资源具有访问权限。当信号量sem 的值大于或等于0时,该进程(或线程)具有公共资源的访问权限;相反,当信号量 sem的值小于零时,该进程(或线程)就将阻塞直到信号量 sem 的值大于等于0 为止。
 
PV原语主要用于进程或线程间的同步和互斥这两种典型情况。若用于互斥,几个进程(或线程)往往只设置一个信号量 sem,它们的操作流程如图所示。
 
当信号量用于同步操作时,往往会设置多个信号量,并安排不同的初始值来实现它们之间的顺序执行,它们的操作流程如图所示。
​​​​​​​        ​​​​​​​        ​​​​​​​        
信号量互斥操作
​​​​​​​        ​​​​​​​        ​​​​​​​        
信号量同步操作
sem_init 用于创建一个信号量,并能初始化它的值。
 
sem_wait 和 sem_trywait 相当于 P 操作,它们都能将信号量的值减一,两者的区别在于若信号量小于0时,sem_wait 将会阻塞进程,而 sem_trywait 则会立即返回。
sem_post 相当于 V 操作,它将信号量的值加一同时发出信号唤醒等待的进程。
 
sem_getvalue 用于得到信号量的值。
sem_destroy 用于删除信号量。
信号量锁实例:

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

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

相关文章

类和对象-C++运算符重载-递增运算符重载

递增运算符重载 #include<bits/stdc.h> using namespace std; //重载递增运算符//自定义整型 class MyInteger {friend ostream & operator<<(ostream & cout,MyInteger myint); public:MyInteger(){m_Num 0;}//重载前置运算符MyInteger& operator()…

隐藏的h1写法(以图换字)

所谓以图换字&#xff0c;即直接使用一张图片或背景&#xff0c;没有文字。我们知道&#xff0c;蜘蛛爬取时是不会获取图片上的内容的&#xff0c;但是如果是添加上文字&#xff0c;即便使用一些字体&#xff0c;也可能达不到图片的显示效果。如何将用户体验与SEO优化相兼容呢&…

Linux CentOs7系统scl镜像源失效问题

1. 问题描述 成功使用下面命令安装scl源后 [rootiZwz946ibli8ikuyqgtc58Z ~]# yum install centos-release-scl-rh尝试使用scl安装redis5&#xff0c;报了下面错误&#xff1a; [rootiZwz946ibli8ikuyqgtc58Z ~]# yum install rh-redis5-redis Loaded plugins: fastestmirro…

移动硬盘“需格式化”危机:应对策略与数据拯救指南

移动硬盘困境&#xff1a;突如其来的“格式化”提示 在日常的数据存储与传输过程中&#xff0c;移动硬盘作为便携且容量可观的存储媒介&#xff0c;深受用户青睐。然而&#xff0c;当这块存储“小能手”突然弹出“需要格式化”的警告时&#xff0c;无疑给用户的数据安全敲响了…

软考中级数据库系统工程师备考经验分享

前几天软考成绩出了&#xff0c;赶紧查询了一下发现自己顺利通过啦&#xff08;上午63&#xff0c;下午67&#xff0c;开心&#xff09;&#xff0c;因此本文记录一下我的备考经验分享给大家。因为工作中项目管理类的知识没有系统学习过&#xff0c;本来想直接报名软考高级证书…

Unity3D 场景树与组件化开发详解

Unity3D是一款功能强大的游戏开发引擎&#xff0c;其独特的场景树和组件化开发模式为开发者提供了高效、灵活的游戏开发体验。本文将详细解析Unity3D中的场景树与组件化开发模式&#xff0c;并给出相应的技术详解和代码实现。 对惹&#xff0c;这里有一个游戏开发交流小组&…

Symfony框架深度解析:构建高效PHP应用的强大基石

引言 在PHP的广阔生态系统中&#xff0c;Symfony框架以其强大的功能、灵活的架构和丰富的社区资源&#xff0c;成为了构建复杂且高性能Web应用的首选之一。自2005年诞生以来&#xff0c;Symfony不断演进&#xff0c;为开发者提供了一套完整且易于扩展的工具集&#xff0c;旨在…

【IO】文件操作

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 文件1.1 认识文件1.2 分清操作的是内存还是硬盘1.3 路径1.3.1 目录结构1.3.2 相对和绝对路径 1.4 文本文件…

速盾:防护攻击CDN

随着互联网的快速发展&#xff0c;网络安全问题也日益突出。其中&#xff0c;DDoS&#xff08;分布式拒绝服务攻击&#xff09;是一种常见的网络安全威胁&#xff0c;能够对目标服务器造成严重影响&#xff0c;使其无法正常运行。为了应对这种威胁&#xff0c;许多企业和组织开…

WIN32核心编程 - 内存管理 内存页面

公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 VirtualAlloc - VirtualFree VirtualAllocEx - VirtualFreeEx VirtualLock(Ex) - VirtualUnlock(Ex) VirtualQuery(Ex) Process Memory Information VirtualProtect(Ex) Heap - GetProce…

大数据Spark 面经

1: Spark 整体架构 Spark 是新一代的大数据处理引擎&#xff0c;支持批处理和流处理&#xff0c;也还支持各种机器学习和图计算&#xff0c;它就是一个Master-worker 架构&#xff0c;所以整个的架构就如下所示&#xff1a; 2: Spark 任务提交命令 一般我们使用shell 命令提…

Flutter-实现双向PK进度条

如何实现一个双向PK进度条 在Flutter应用中&#xff0c;进度条是一个非常常见的组件。而双向PK进度条则能够展示两个对立的数值&#xff0c;如对战中的双方得分对比等。本文将介绍如何实现一个具有双向PK效果的进度条&#xff0c;并支持竖直和斜角两种过渡效果。 1. 需求 我…

FMEA在大型光伏电站安全生产管理中的应用

一、FMEA概述 FMEA&#xff08;Failure Modes and Effects Analysis&#xff09;即失效模式和影响分析&#xff0c;是一种用于识别和分析产品或过程中潜在故障模式及其影响的方法。它通过对产品或过程中可能出现的故障模式进行系统性地梳理和分析&#xff0c;评估其可能的影响…

配置Nginx来代理多个Docker微服务组成统一的后台服务

配置Nginx来代理多个Docker微服务组成统一的后台服务可以通过以下步骤完成&#xff1a; 假设情境和准备工作 假设你有多个 Docker 容器&#xff0c;每个容器运行一个微服务&#xff0c;例如&#xff1a; 微服务1: 可以通过 http://localhost:8001 访问微服务2: 可以通过 htt…

并查集[讲课留档]

并查集&#xff08;DSU&#xff09; 一些可以实现合并和 查询的 集合。 简洁优雅的树型数据结构&#xff0c;主要用于解决一些元素分组的问题。可以管理一系列不相交的集合&#xff0c;并支持两种操作&#xff1a; 合并&#xff08;join&#xff09;&#xff1a;把两个不相交…

通过SDK使用百度智能云的图像生成模型SDXL

登录进入百度智能云控制台&#xff0c;在模型广场按照图像生成类别进行筛选&#xff0c;可以找到Stable-Diffusion-XL模型。点击Stable-Diffusion-XL模型的API文档后在弹出的新页面下拉可以找到SDK调用的说明。 import qianfandef sdxl(file: str, prompt: str, steps: int 2…

MySQL——PreparedStatement对象

PreparedStatement可以防止SQL注入&#xff0c;效率更高。 1. 增 public class TestInsert {public static void main(String[] args) throws SQLException {Connection conn null;PreparedStatement ps null;ResultSet rs null;try {conn jdbcUtils.getConnection();// …

矩阵分析与应用1-矩阵代数基础

矩阵分析与应用1-矩阵代数基础 1 矩阵的基本运算2 矩阵的初等变换3 向量空间、线性映射与Hilbert空间4 内积与范数5 随机向量6 矩阵的性能指标7 逆矩阵与伪逆矩阵8 Moore-Penrose逆矩阵9 矩阵的直和与Hadamard积10 Kronecker积与Khatri-Rao积11 向量化与矩阵化12 稀疏表示与压缩…

金丝键合强度测试仪试验条件要求:键合拉脱/引线拉力/剪切力等

金丝键合强度测试仪是测量引线键合强度&#xff0c;评估键合强度分布或测定键合强度是否符合有关的订购文件的要求。键合强度试验机可应用于采用低温焊、热压焊、超声焊或有关技术键合的、具有内引线的器件封装内部的引线-芯片键合、引线-基板键合或内引线一封装引线键合&#…

华为机试HJ23删除字符串中出现次数最少的字符

华为机试HJ23删除字符串中出现次数最少的字符 题目&#xff1a; 实现删除字符串中出现次数最少的字符&#xff0c;若出现次数最少的字符有多个&#xff0c;则把出现次数最少的字符都删除。输出删除这些单词后的字符串&#xff0c;字符串中其它字符保持原来的顺序。 想法&…