线程控制(同步相关)

一,定义及用途

1.概念

有一定先后顺序的对资源的排他性访问

2.用途

在多线程中,线程按照一定顺序运行。

3.与互斥锁的关系和区别

互斥包含同步,同步是互斥的一个特例

  1. 互斥锁,加锁和解锁 是同一个线程

信号量(同步),th1 释放th2, th2释放th1. 是由线程交叉释放。

  1. 在互斥锁保护的代码中(临界区)。不要休眠,不要大耗时的操作。临界区代码短小精悍

信号量,适当可以有休眠,小的耗时操作。

用法: 计数信号量 。信号量的初值(3,5)是可以大于1的。 这种情况,用于互斥的情况,资源数本

身不唯一(多个资源)。

二,同步步骤及相关函数

1.步骤:

信号量的定义 =》信号量的初始化 ==》信号量的PV操作=》信号量的销毁

2.相关函数

1.信号量的定义:

复制代码
sem_t sem

2.信号量的初始化:

复制代码
int sem_init(sem_t *sem, int pshared, unsigned int value)

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

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

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

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

value: 信号量的初始值,一般无名信号量 都是二值信号量,0 1

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

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

**返回值:**成功 0;失败 -1

3.信号量的pv操作

P ===》申请资源===》申请一个二值信号量

V ===》释放资源===》释放一个二值信号量

P操作对应函数 ==》sem_wait();

V操作对应函数 ==》sem_post();

复制代码
int sem_wait(sem_t *sem)

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

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

如果sem没有资源(==0),则线程阻塞等待,一旦有资源,则自动申请资源并继续运行程序。

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

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

**返回值:**成功 0; 失败 -1

4.信号量的销毁

复制代码
int sem_destroy(sem_t *sem)

功能: 使用完毕将指定的信号量销毁
参数: sem要销毁的信号量
**返回值:**成功 0;失败 -1

三,死锁

1.概念

由于锁资源安排的不合理(锁资源的申请和释放逻辑不对),导致进程,线程无法正常继续执行(推

进)的现象。

2.产生条件

(1) 互斥条件:一个资源每次只能被一个进程使用。

(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

相关推荐
庞轩px2 天前
线程本地缓存?CPU缓存!
缓存·线程·cpu·volatile·可见性·本地内存
艾莉丝努力练剑2 天前
【Linux线程】Linux系统多线程(六):<线程同步与互斥>线程同步(上)
java·linux·运维·服务器·c++·学习·线程
AIminminHu3 天前
OpenGL渲染与几何内核那点事-项目实践理论补充(三-1-(3):番外篇-当你的CAD打开“怪兽级”STL时:从内存爆炸到零拷贝的极致优化)
开发语言·c++·线程·多线程
庞轩px10 天前
深入理解 sleep() 与 wait():从基础到监视器队列
java·开发语言·线程··wait·sleep·监视器
长谷深风11110 天前
线程与进程:高效并发编程的核心奥秘
线程·进程·juc·并发与并行·上下文切换(性能影响因素)·多线程(应用重点)
Lucis__10 天前
Linux系统收官篇:线程学习的一些心得总结
linux·学习·线程
艾莉丝努力练剑14 天前
【Linux线程】Linux系统多线程(一):线程概念
java·linux·运维·服务器·开发语言·学习·线程
czhc114007566317 天前
winform 330 跨线程 异步
wpf·线程·winform
庞轩px21 天前
ThreadLocal 源码分析与内存泄漏问题
java·jvm·线程·threadlocal·内存泄露·key-value
夏乌_Wx21 天前
Linux 多线程编程详解:从基础概念到同步机制
linux·操作系统·线程·线程同步