一、线程间通信
使用全局变量实现多个线程间通信
1.资源
资源是有限的,程序运行过程中的CPU、内存、变量等等都可以看成是资源
2.临界代码、临界区
加锁、解锁中间的代码称为临界代码或临界区,同一时刻,不同线程中的临界区代码不会同时被执行
3.原子操作
不能被CPU任务调度所打断的一次最小的操作单元
4.互斥锁
1.pthread_mutex_init
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_ t *restrict attr);
功能:
初始化互斥锁
参数:
mutex:互斥锁变量空间首地址
attr:属性 默认NULL
返回值:
成功返回0
失败返回错误码
2.pthread_mutex_destroy
int pthread_mutex_destroy(pthread_mutex_t *mutex);
功能:
销毁互斥锁
参数:
mutex:互斥锁空间首地址
返回值:
成功返回0
失败返回错误码
3.pthread_mutex_lock
int pthread_mutex_lock(pthread_mutex_t *mutex);
功能:
上锁
参数:
mutex:锁资源空间首地址
返回值:
成功返回0
失败返回错误码
4.pthread_mutex_unlock
int pthread_mutex_unlock(pthread_mutex_t *mutex);
功能:
解锁
参数:
mutex:锁资源空间首地址
返回值:
成功返回0
失败返回错误码
5.死锁
多线程通信时,由于加锁导致多个任务无法继续向下执行,阻塞的状态成为死锁
死锁产生的必要条件:
1.互斥条件
2.不可剥夺条件
3.请求保持条件
4.循环等待条件
避免产生死锁:
1.多任务加锁顺序保持一致
2.使用pthread_mutex_trylock替代pthread_mutex_lock
6.互斥锁使用场景
多线程操作共享空间,加锁
二、线程同步
1.信号量
是一种资源,可以被申请、释放、初始化、销毁
2.函数接口
1.sem_init
int sem_init(sem_t *sem, int pshared, unsigned int value);
功能:
初始化信号量的值
参数:
sem:信号量空间的首地址
pshared:
0 线程间共享
非0 进程间共享
value:
信号量的值
返回值:
成功返回0
失败返回-1
2.sem_destroy
int sem_destroy(sem_t *sem);
功能:
信号量的销毁
参数:
信号量空间的首地址
返回值:
成功返回0
失败返回-1
3.sem_wait
int sem_wait(sem_t *sem);
功能:
申请信号量
参数:
sem:信号量空间首地址
返回值:
成功返回0
失败返回-1
4.sem_post
int sem_post(sem_t *sem);
功能:
释放信号量
参数:
sem:信号量空间首地址
返回值:
成功返回0
失败返回-1