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

线程的控制

互斥

概念

互斥:在多线程中对临界资源(公共资源)的排他性访问。
互斥机制 >>互斥锁  >>保证临界资源的访问控制。

通过使用互斥锁,可以确保某一时刻只有一个线程能够访问临界资源,从而避免竞争条件(race conditions)的发生

pthread_mutex_t   mutex;
互斥锁类型        互斥锁变量 内核对象

框架:
 定义互斥锁 >>初始化锁 >>加锁 >>解锁 >>销毁
****                                        ***      ***


定义

pthread_mutex_t   mutex;

定义变量(一般定义为全局变量)

初始化锁

int pthread_mutex_init(pthread_mutex_t *mutex,
const pthread_mutexattr_t *attr);
  • 功能

将已经定义好的互斥锁初始化。

  • 参数

mutex 要初始化的互斥锁
atrr  初始化的值,一般是NULL表示默认锁

  • 返回值

成功 0        失败 非零


加锁

int pthread_mutex_lock(pthread_mutex_t *mutex);
  • 功能

用指定的互斥锁开始加锁代码
加锁后的代码到解锁部分的代码属于原子操作(最小操作、不可再分割的操作),
在加锁期间其他进程/线程都不能操作该部分代码(这部分代码应该尽可能短)
如果该函数在执行的时候,mutex已经被其他部分使用则代码阻塞。

  • 参数

 mutex 用来给代码加锁的互斥锁

  • 返回值

成功 0        失败 非零

加锁时机

  • 访问共享资源时

在任何线程需要读写共享资源(如全局变量、共享数据结构、文件等)之前,应该先上锁。这样可以防止其他线程同时访问这个资源,导致数据竞争或不一致的问题。

例如:在一个银行账户系统中,多个线程同时更新账户余额时,应在修改余额之前锁定。

  • 进入临界区时

临界区是指代码中可能被多个线程并发访问,且访问时需要互斥的部分。临界区通常是需要同步的代码块,在进入临界区前应上锁。

例如:在生产者-消费者模型中,生产者和消费者访问同一个缓冲区时,需要在进入缓冲区的操作代码之前上锁。

  • 检查或修改共享状态时

如果线程需要检查或修改某个共享状态(如队列的长度、任务的状态等),应该在检查或修改之前上锁,以确保其他线程不会在中间更改状态。

例如:在线程池中,当线程检查是否有任务可用时,应先上锁以确保状态一致


解锁

int pthread_mutex_unlock(pthread_mutex_t *mutex);
  • 功能

将指定的互斥锁解锁。
解锁之后代码不再排他访问,一般加锁解锁同时出现。

  • 参数

用来解锁的互斥锁

  • 返回值

成功 0        失败 非零

解锁时机

  • 离开临界区时

当线程完成了对共享资源的访问或完成了临界区的操作,应立即解锁。这样其他等待的线程可以获取锁并继续执行,避免死锁或资源饥饿。

例如:在修改完共享数据之后,线程应立即解锁以释放互斥锁,让其他线程可以访问共享数据。

  • 操作完成时

如果锁是为了保护某个操作的原子性(即操作不可分割),那么在操作完成后应解锁。

例如:如果线程锁定了一个文件进行读写操作,在操作完成后应解锁,以便其他线程可以访问文件。

  • 上锁:在访问共享资源、进入临界区、或检查/修改共享状态之前上锁
  • 解锁:在离开临界区、操作完成后立即解锁

 销毁

 int pthread_mutex_destroy(pthread_mutex_t *mutex);
  • 功能

使用互斥锁完毕后需要销毁互斥锁

  • 参数

mutex 要销毁的互斥锁

  • 返回值

成功  0        失败  非零
 

trylock

int pthread_mutex_trylock(pthread_mutex_t *mutex);
  • 功能

类似加锁函数效果,唯一区别就是不阻塞

  • 参数

mutex 用来加锁的互斥锁

  • 返回值

成功 0        失败 非零
当锁已经被占用时,通常返回 E_AGAIN

同步

线程的同步 

同步 :有一定先后顺序的对资源的排他性访问。

同步产生原因:互斥锁可以控制排他访问但没有次序。

linux下的线程同步 >>信号量机制 >>semaphore.h   posix 
sem_open();


信号量的分类:
1、无名信号量 ——线程间通信
2、有名信号量 ——进程间通信

框架:
信号量的定义>>信号量的初始化 >>信号量的PV操作>>信号量的销毁
 


信号量的定义 

semaphore 
sem_t            sem;
信号量的类型     信号量的变量

信号量的初始化

int sem_init(sem_t *sem, int pshared, unsigned int value);
  • 功能

将已经定义好的信号量赋值。

  • 参数

sem 要初始化的信号量
pshared = 0 ;表示线程间使用信号量
             !=0 ;表示进程间使用信号量
value 信号量的初始值,一般无名信号量
          都是二值信号量,0 1 
          0 表示红灯,进程暂停阻塞
          1 表示绿灯,进程可以通过执行

返回值:成功  0        失败  -1;


信号量的PV 操作

P :申请资源——申请一个二值信号量 (0or1)
V :释放资源——释放一个二值信号量

P操作对应函数 :sem_wait();
V操作对应函数 :sem_post();
 

sem_wait()

int sem_wait(sem_t *sem);
  • 功能

判断当前sem信号量是否有资源可用。
  如果sem有资源(==1),则申请该资源,程序继续运行
  如果sem没有资源(==0),则线程阻塞等待,一 旦有资源
  则自动申请资源并继续运行程序。

  注意:sem 申请资源后会自动执行 sem = sem - 1;(可用作计数信号量)

  • 参数

sem 要判断的信号量资源

  • 返回值

成功 0         失败 -1

sem_post()

int sem_post(sem_t *sem);
  • 功能

函数可以将指定的sem信号量资源释放
  并默认执行,sem = sem+1;
  线程在该函数上不会阻塞。

  • 参数

sem 要释放资源的信号量

  • 返回值

成功 0        失败 -1;



信号量的销毁

int sem_destroy(sem_t *sem);
  • 功能

使用完毕将指定的信号量销毁

  • 参数

sem要销毁的信号量

  • 返回值

死锁的产生

产生死锁的原因

主要是:
(1) 因为系统资源不足。
(2) 进程运行推进的顺序不合适。
(3) 资源分配不当等。
如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则
就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。

产生死锁的四个必要条件

(1) 互斥条件:一个资源每次只能被一个进程(线程)使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

相关文章:

线程的控制

互斥 概念 互斥:在多线程中对临界资源(公共资源)的排他性访问。 互斥机制 >>互斥锁 >>保证临界资源的访问控制。 通过使用互斥锁,可以确保某一时刻只有一个线程能够访问临界资源,从而避免竞争条件(race condition…...

WPS宏实现Sheet页拆分功能

源表格首列名称中一样的分别创建该名称的Sheet页,首先把首列复制导致Sheet2页,根据去重后的值创建新的Sheet页,把源表格数据复制到新建的Sheet页,遍历删除不需要的留下需要的就完成了。 function JIn521() { //设置工作…...

【图像超分】论文精读:AdaBM: On-the-Fly Adaptive Bit Mapping for Image Super-Resolution

第一次来请先看这篇文章:【超分辨率(Super-Resolution)】关于【超分辨率重建】专栏的相关说明,包含专栏简介、专栏亮点、适配人群、相关说明、阅读顺序、超分理解、实现流程、研究方向、论文代码数据集汇总等) 文章目录 前言Abstract1. Introduction2. Related works3. Pr…...

深信服应届生客户经理面试经验分享

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330#rd 《网安面试指南》http://mp.weixin.qq.com/s?…...

什么是应用交付控制器(ADC)

什么是应用交付控制器(ADC) 应用交付控制器(ADC)是一种网络设备,可帮助管理和优化面向最终用户的基于web的应用程序和服务的交付,根据服务器可用性、网络拥塞和用户位置等因素,将传入的web流量…...

旅游管理系统

TOC springboot0748旅游管理系统 第1章 绪论 1.1课题背景 计算机的普及和互联网时代的到来使信息的发布和传播更加方便快捷。用户可以通过计算机上的浏览器访问多个应用系统,从中获取一些可以满足用户需求的管理系统。网站系统有时更像是一个大型“展示平台”&a…...

AVI-Talking——能通过语音生成很自然的 3D 说话面孔

概述 论文地址:https://arxiv.org/pdf/2402.16124v1.pdf 逼真的人脸三维动画在娱乐业中至关重要,包括数字人物动画、电影视觉配音和虚拟化身的创建。以往的研究曾试图建立动态头部姿势与音频节奏之间的关联模型,或使用情感标签或视频剪辑作…...

走进虚拟机逃逸技术之VMware Escape漏洞CVE-2023-20872复现

走进虚拟机逃逸技术之VMware Escape漏洞CVE-2023-20872复现 技术分享 技术分享 起初,为了学习虚拟机逃逸相关技术,也为了搞懂硬件虚拟化。于是请教了某巨佬后告诉我一本书,看完之后为了验证我理解到的硬件虚拟化及虚拟化逃逸原理是否正确&am…...

leetcode118. 杨辉三角,老题又做

leetcode118. 杨辉三角 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输入: numRows 1…...

进程(一)(22)

1.进程是什么 进程是程序执行的过程,会去分配内存资源,cpu的调度。正在运行的程序叫进程。 并发:同一时刻可以同时完成多个任务。 进程: 是操作系统对正在运行的程序的抽象。进程不仅包括程序的代码,还包括程序的执行状态、内存…...

Excel“取消工作表保护”忘记密码并恢复原始密码

文章目录 1.前言2.破解步骤3. 最终效果4.参考文献 1.前言 有时候别人发来的Excel中有些表格不能编辑,提示如下,但是又不知道原始密码 2.破解步骤 1、打开您需要破解保护密码的Excel文件; 2、依次点击菜单栏上的视图—宏----录制宏&#xf…...

WPS关闭后,进程依然在后台运行的解决办法

问题 wps启动后 在启动wps后,什么都不做,打开进程管理器,发现居然运行了3个wps进程: win10只会显示wps进程: win11显示比较准确: 关闭后 在关闭wps,再去任务管理器查看,发现在…...

SQL每日一练-0816

今日SQL题:计算每个项目的年度收入增长率 难度系数:🌟☆☆☆☆☆☆☆☆☆ 1、题目要求 计算每个项目每年的收入总额,并计算项目收入环比增长率。找出每年收入增长率最高的项目。输出结果显示年份、项目ID、项目名称、项…...

直方图均衡化

概念 直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法,通过拉伸像素强度分布范围来增强图像对比度。 原理 均衡化指的是把一个分布 (给定的直方图) 映射 到另一个分布 (一个更宽更统一的强度值分布),从而令强度值分布会在整个范围内…...

Golang | Leetcode Golang题解之第342题4的幂

题目: 题解: func isPowerOfFour(n int) bool {return n > 0 && n&(n-1) 0 && n%3 1 }...

数学建模学习(116):全面解析梯度下降算法及其在机器学习中的应用与优化

文章目录 1.梯度下降简介1.1 梯度下降的数学原理1.2 学习率的选择2 梯度下降变体3.梯度下降优化器3.1 动量法(Momentum)3.2 AdaGrad3.3 RMSprop3.4 Adam3.5 Python 使用不同优化器训练线性回归模型4.案例:使用梯度下降优化加利福尼亚房价预测模型4.1. 数据准备4.2. 模型训练…...

[mysql][sql]mysql查询表大小

select table_schema as 数据库, table_name as 表名, table_rows as 记录数, truncate(data_length/1024/1024, 2) as 数据容量(MB), truncate(index_length/1024/1024, 2) as 索引容量(MB) from information_schema.tables where 11 and table_schemadb001 order by table_ro…...

8.16 mysql主从数据库(5.7版本)与python的交互及mycat

mysql数据库基本操作: [rootm ~]# tar -xf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz 解压压缩包 [rootm ~]# ls anaconda-ks.cfg mysql-5.7.44-linux-glibc2.12-x86_64 mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz [rootm ~]# cp -r mysql-5.7.44-lin…...

项目问题 | CentOS 7停止维护导致yum失效的解决办法

目录 centos停止维护意味着yum相关源伴随失效。 报错: 解决方案:将图中四个文件替换掉/etc/yum.repos.d/目录下同名文件 资源提交在博客头部,博客结尾也提供文件源码内容 CentOS-Base.repo CentOS-SCLo-scl.repo CentOS-SCLo-scl-rh.rep…...

【Docker】Docker Compose(容器编排)

一、什么是 Docker Compose docker-compose 是 Docker 官方的开源项目,使用 python 编写,实现上调用了 Docker 服务的 API 进行容器管理及编排,其官方定义为定义和运行多个 Docker 容器的应用。 docker-compose 中有两个非常重要的概念&…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

synchronized 学习

学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

docker详细操作--未完待续

docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

centos 7 部署awstats 网站访问检测

一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...