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;

相关推荐
独行soc37 分钟前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
White_Mountain1 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
Code apprenticeship1 小时前
怎么利用Redis实现延时队列?
数据库·redis·缓存
百度智能云技术站1 小时前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle
装不满的克莱因瓶1 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
cominglately2 小时前
centos单机部署seata
linux·运维·centos
魏 无羡2 小时前
linux CentOS系统上卸载docker
linux·kubernetes·centos
CircleMouse3 小时前
Centos7, 使用yum工具,出现 Could not resolve host: mirrorlist.centos.org
linux·运维·服务器·centos
梦想平凡3 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle
TianyaOAO3 小时前
mysql的事务控制和数据库的备份和恢复
数据库·mysql