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;

相关推荐
A小辣椒18 小时前
TShark:Wireshark CLI 功能
linux
倔强的石头_21 小时前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
A小辣椒1 天前
TShark:基础知识
linux
BingoGo1 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack1 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
AlfredZhao1 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
冬奇Lab1 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户3074596982072 天前
PHP 扩展——从入门到理解
php
ClouGence2 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle