20250828的学习笔记
一、互斥锁
1、定义互斥锁
pthread_mutex_t mutex;
2、初始化锁
int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *attr);
功能:
将已经定义好的互斥锁初始化。
参数:
mutex要初始化的互斥锁
atr 初始化的值,一般是NULL表示默认锁
返回值:
成功 0
失败 非0
3、加锁
Int pthread_mutex_lock(pthread_mutex_t *mutex);
功能:
用指定的互斥锁开始加锁代码,加锁后的代码到解锁部分的代码属于原子操作,在加锁期间其他进程/线程都不能操作该部分代码,如果该函数在执行的时候,mutex已经被其他部分使用则代码阻塞。
参数:
mutex用来给代码加锁的互斥锁
返回值:
成功 0
失败 非0
4、解锁
int pthread_mutex_unlock(pthread_mutex_t *mutex);
功能:
将指定的互斥锁解锁。
参数:
用来解锁的互斥锁
返回值:
成功 0
失败 非零
5、销毁
int pthread_mutex_destroy(pthread_mutex_t *mutex);
功能:
使用互斥锁完毕后需要销毁互斥锁
参数:
mutex要销毁的互斥锁
返回值:
成功 0
失败 非0
6、trylock
int pthread_mutex_trylock(pthread_mutex_t *mutex);
功能:
类似加锁函数效果,唯一区别就是不阻塞。
参数:
mutex用来加锁的互斥锁
返回值:
成功 0
失败 非零
二、信号量
1、信号量的分类
1、无名信号量 ==》线程间通信
2、有名信号量 ==》进程间通信
2、信号量的定义
sem_t sem;
3、信号量的初始化
int sem_init(sem_t *sem, int pshared, unsigned int value);
功能:
将已经定义好的信号量赋值。
参数:
sem 要初始化的信号量。
pshared =0;表示线程间使用信号量。
pshared!=0;表示进程间使用信号量。
value 信号量的初始值,一般无名信号量都是二值信号量0和1。
0 表示红灯,进程暂停阻塞。
1表示绿灯,进程可以通过执行。
返回值:
成功 0
失败 -1
4、信号量的PV操作
P ===》申请资源===》申请一个二值信号量
V ===》释放资源===》释放一个二值信号量
P操作对应函数 ==》sem_waitO;
V操作对应函数 ==》sem_postO;
int sem_wait(sem_t *sem);
功能:
判断当前sem信号量是否有资源可用。如果sem有资源(==1),则申请该资源,程序继续运行。如果sem没有资源(==0),则线程阻塞等待。一旦有资源,则自动申请资源并继续运行程序。
注意:sem 申请资源后会自动执行 sem = sem - 1;
参数:
sem 要判断的信号量资源。
返回值:
成功 0
失败 -1
int sem_post(sem_t *sem);
功能:
函数可以将指定的sem信号量资源释放,并默认执行,sem = sem+1;线程在该函数上不会阻塞。
参数:
sem 要释放资源的信号量。
返回值:
成功 0
失败 -1
5、信号量的销毁
int sem_destroy(sem_t *sem);
功能:
使用完毕将指定的信号量销毁。
参数:
sem要销毁的信号量。
返回值:
成功 0
失败 -1