一,互斥
1.概念
(1)互斥:在多线程中对临界资源的排他性访问。
(2)临界资源:在多线程中,会对这个资源进行读写操作的全局变量,文件,设备。
(3)排他访问:在多线程中,只能有一个线程进行读写操作。
2.用途
问题:
th1,th2, 是两个线程,是并发运行。也就是代码在运行时,是穿插进行的。
如果A++,这个指令翻译成汇编是3句(至少)。在一次线程的调度,这3句汇编,不一定一次性执
行。也就是说可呢个th1 执行了 1,2步,就切换到th2 执行。这个时候就会发生错误(数据的一致行
性出现问题)。
解决方案:
定义互斥锁 ==》初始化锁 ==》加锁 ==》解锁 ==》销毁
相关函数:
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; 失败 非零