一、线程控制:互斥和同步
对于线程的共享资源的竞争的处理;
进程也能用,对进程竞争的系统资源的分配;
二、互斥
1.互斥:在多线程中对临界资源的排他性(独占)访问;
2.互斥机制(互斥锁):以保证临界资源的访问控制;
3.pthread_mutex_t mutex;互斥锁;
(1)初始化
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);
pthread_mutex_t *restrict mutex:是一个pthread_mutex_t型的结构体;
const pthread_mutexattr_t *restrict attr:初始化属性;
成功返回0;
(2)销毁
int pthread_mutex_destroy(pthread_mutex_t *mutex);
(3)上锁
int pthread_mutex_lock(pthread_mutex_t *mutex);
必须与解锁配套用;
加锁后的代码到解锁部分的代码属于原子操作,让cpu在一次调度内走完,此时其他线程不能操作本段代码;
成功返回0;
(4)解锁
int pthread_mutex_unlock(pthread_mutex_t *mutex);
(5)trylock
int pthread_mutex_trylock(pthread_mutex_t *mutex);
非阻塞性锁;
成功返回0;
4.互斥锁要尽量小内容;一般不要做耗时的操作;不要在里面有延时;
三、同步
1.同步是有一定先后顺序的对资源的排他性访问;可以理解为加了条件的互斥;
2.通过信号量做同步;
3.swmaphore信号量的定义:
头文件#include<semaphore.h>
int sem_init(sem_t *sem,int pshared,unsigned int value);
sem:需要初始化的信号量;
pshared:0表示线程间使用信号量,非0表示进程间使用信号量;
value:信号量的初值;一般都是二值信号量(0/1)1时可以通过执行;可以在用作计数信号量时赋计数数值;
成功返回0,失败返回-1;
4.信号量的PV操作:
P是申请资源:申请一个二值信号量(+1)对应函数sem_wait();
V是释放资源:释放一个二值信号量(-1)对应函数sem_post();
int sem_wait(sem_t *sem);
判断当前sem信号是否有资源可用;如果有则申请并运行,如果没有则堵塞等待;
sem申请后会自动执行类似sem--的操作,使信号量变小;
成功返回0,失败返回-1;
int sem_post(sem_t *sem)
把sem信号量资源释放;自动执行类似sem++的操作;不会堵塞;
成功返回0,失败返回-1;
5.销毁
int sem_destroy(sem_t *sem);
将使用完毕的sem信号量销毁;
成功返回0,失败返回-1;
四、产生死锁的四个必要条件:
1.互斥条件:一个资源每次只能被一个进程使用。
2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3.不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。