Linux——进程(4)

一、线程控制:互斥与同步

  • 临界资源: 共享资源
  • 临界区 : 一段代码区域(访问临界资源的那段代码)
  • 原子操作: 要么不操作,要操作,一定是一次完整的操作。不能被打断。

1、概念

互斥 :在多线程中对临界资源的排他性访问。

互斥机制 (互斥锁 ):保证临界资源的访问控制。

pthread_mutex_t mutex;

互斥锁类型 互斥锁变量(内核对象)

框架:

定义互斥锁 ==》初始化锁 ==》加锁 ==》解锁 ==》销毁

**** *** ***

//互斥锁 互斥量

pthread_mutex_init(); //初始化一把锁

pthread_mutex_lock(); //上锁

pthread_mutex_unlock(); //解锁

pthread_mutex_destroy();//销毁一把锁

二、互斥锁

1、定义

pthread_mutex_t mutex;

2、初始化锁

int pthread_mutex_init( pthread_mutex_t *mutex,

const pthread_mutexattr_t *attr);

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

参数:mutex 要初始化的互斥锁

atrr 初始化的值,

一般是NULL表示默认锁

返回值:成功 0

失败 非零

3、加锁

int pthread_mutex_lock(pthread_mutex_t *mutex);

功能:用指定的互斥锁开始加锁代码

加锁后的代码到解锁部分的代码属于原子操作,

在加锁期间其他进程/线程都不能操作该部分代码

如果该函数在执行的时候,mutex已经被其他部分

使用则代码阻塞。

参数: mutex 用来给代码加锁的互斥锁

返回值:成功 0

失败 非零

4、解锁

int pthread_mutex_unlock(pthread_mutex_t *mutex);

功能:将指定的互斥锁解锁。

解锁之后代码不再排他访问,一般加锁解锁同时出现。

参数:用来解锁的互斥锁

返回值:成功 0

失败 非零

5、销毁

int pthread_mutex_destroy(pthread_mutex_t *mutex);

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

参数:mutex 要销毁的互斥锁

返回值:成功 0

失败 非零

6、trylock

int pthread_mutex_trylock(pthread_mutex_t *mutex);

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

参数:mutex 用来加锁的互斥锁

返回值:成功 0

失败 非零

三、线程的同步

  • 同步 :有 一定先后顺序的,对资源的排他性访问。
  • 互斥:在多线程中对临界资源的排他性访问。
  • 原因:互斥锁可以控制排他访问但没有次序。
  • 信号量 :实现线程间的同步.
  • 信号量 (个数) : 反映的是资源的数量

四、信号量

1、信号量的分类

1)、信号无名量 :线程间通信

2)、有名信号量 :进程间通信

2、框架

  • 信号量的定义 sem_t sem //造了一类资源
  • 信号量的初始化 sem_init
  • 信号量的PV操作 (核心) sem_wait()/ sem_post()
  • 信号量的销毁。 sem_destroy

3、信号量的定义

sem_t sem;

信号量的类型 信号量的变量

4、信号量的初始化

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

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

参数:sem 要初始化的信号量

pshared = 0 ;表示线程间使用信号量

!=0 ;表示进程间使用信号量

value 信号量的初始值,一般无名信号量

都是二值信号量,0 1

0 表示红灯,进程暂停阻塞

1 表示绿灯,进程可以通过执行

返回值:成功 0

失败 -1;

5、信号量的PV 操作

P (申请资源):申请一个二值信号量

V (释放资源):释放一个二值信号量

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

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

int sem_wait(sem_t *sem); //p操作

功能:

判断当前sem信号量是否有资源可用。

如果sem有资源(==1),则申请该资源,程序继续运行

如果sem没有资源(==0),则线程阻塞等待,一旦有资源

则自动申请资源并继续运行程序。

注意:sem 申请资源后会自动执行 sem = sem - 1;

参数:sem 要判断的信号量资源

返回值:成功 0

失败 -1

int sem_post(sem_t *sem); //V操作

功能:

函数可以将指定的sem信号量资源释放

并默认执行,sem = sem+1;

线程在该函数上不会阻塞。

参数:sem 要释放资源的信号量

返回值:成功 0

失败 -1;

5、信号量的销毁

int sem_destroy(sem_t *sem);

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

参数:sem要销毁的信号量

返回值:成功 0

失败 -1;

相关推荐
全栈老石2 小时前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
倔强的石头_21 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
chlk1231 天前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑1 天前
Ubuntu系统安装CodeX出现问题
linux·后端
改一下配置文件1 天前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
BingoGo1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
深紫色的三北六号2 天前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash2 天前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库