一、线程控制:互斥与同步
- 临界资源: 共享资源
- 临界区 : 一段代码区域(访问临界资源的那段代码)
- 原子操作: 要么不操作,要操作,一定是一次完整的操作。不能被打断。
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;