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;

相关推荐
CoolTiger、1 小时前
【Vmware16安装教程】
linux·虚拟机·vmware16
学习3人组2 小时前
CentOS 中配置 OpenJDK以及多版本管理
linux·运维·centos
高兴就好(石2 小时前
DB-GPT部署和试用
数据库·gpt
厨 神2 小时前
vmware中的ubuntu系统扩容分区
linux·运维·ubuntu
这孩子叫逆2 小时前
6. 什么是MySQL的事务?如何在Java中使用Connection接口管理事务?
数据库·mysql
Karoku0662 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
geek_Chen012 小时前
虚拟机共享文件夹开启后mnt/hgfs/下无sharefiles? --已解决
linux·运维·服务器
码农郁郁久居人下3 小时前
Redis的配置与优化
数据库·redis·缓存
(⊙o⊙)~哦3 小时前
linux 解压缩
linux·运维·服务器
MuseLss4 小时前
Mycat搭建分库分表
数据库·mycat