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;

相关推荐
四七伵15 小时前
Spring Boot项目中varchar字段为什么不用NULL?告别空指针从建表开始
数据库·后端
Mr.456715 小时前
JDK17+Druid+SpringBoot3+ShardingSphere5 多表分库分表完整实践(MySQL+PostgreSQL)
java·数据库·spring boot·mysql·postgresql
Elastic 中国社区官方博客15 小时前
使用 ES|QL 变量控件将仪表板转变为调查工具
大数据·运维·服务器·数据库·elasticsearch·搜索引擎·全文检索
feng68_15 小时前
Ansible还原数据库节点
linux·运维·数据库·ansible
乐hh15 小时前
清理MySQL数据
数据库·mysql
来鸟 鸣间15 小时前
oops问题定位记录
linux·c语言
EasyCVR15 小时前
国标GB28181/RTSP/ONVIF/RTMP视频监控平台EasyCVR视频质量诊断花屏/蓝屏/画面模糊/冻结检测
网络·数据库·音视频
C^h15 小时前
RTthread中的内存池理解
linux·数据库·c++·算法·嵌入式
fobwebs15 小时前
wordpress 网站安装了Yoast SEO,并且做了内容的优化后,如果想重置Yoast SEO,并且删除所有的优化内容,应该如何操作?
数据库·yoast seo·重置yoast seo·清空yoast seo内容
司南-704915 小时前
claude初探- 国内镜像安装linux版claude
linux·运维·服务器·人工智能·后端