功能:对共享资源实现互斥访问,保证访问的完整性
如果使用互斥锁,每个线程在访问共享资源,都必须先获得互斥锁,然后在访问共享资源,如果无法获得互斥锁,则表示有其他线程正在访问共享资源,此时没有获得锁的线程会阻塞,直到其他线程释放锁,能再次获得锁。
(核心:无序、竞争:不知道谁先获得互斥锁,谁后获得)
流程:
1.定义互斥锁(全局变量,让每个线程都能访问到)
pthread_mutex_t lock;
@pthread_mutex_lock :联合体类型,知道是锁的类型就行,不用管具体,实在要看用vi -t 类型名 就可以查看
(注意:如果初始化打算用静态的话,可以在定义锁的时候直接初始化)
2.初始化
1)动态初始化(线程创建之前初始化):
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
@mutex :很简单,就是锁,但是为什么要加restrict修饰呢?
(restrict 是一种c99引入的类型限定符,意思是mutex指向的内存单元数据只能通过mutex这个指针来操作,任何其他直接赋值或者间接操作:比如引入另外一个指针来代替mutex都不行)
@attr :前期先不管,知道是属性就行,通常用NULL代替;
2)静态初始化:
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
3.获得互斥锁(变量用lock操作)
1)int pthread_mutex_lock(&lock);
2)int pthread_mutex_trylock(&lock);
(注意:每个线程持有锁的时间越少越好,所以要在线程操作共享资源之前加锁)
(一开始我有疑惑,trylock有意义吗?尝试获得锁,没有就继续执行,那我尝试不尝试获得锁也一样执行接下来的代码。
解答:思维错误!锁执行的程序是针对共享资源的,trylock的意义在于:通过判断它立即返回的值,可以把对共享资源的代码和对非共享资源的代码区分开来,这样就不会一直阻塞在那里,浪费时间)
4.释放互斥锁(操作共享资源结束最好立马释放互斥锁)
int pthread_mutex_unlock(&lock);
5.释放锁(确保没有一个线程在使用它才能销毁)
int pthread_mutex_destroy(&lock);
互斥锁只能被短时间拥有,如果象等待输入这种持续时间不确定的情况,就不能用互斥锁。
阅读(2403) | 评论(0) | 转发(0) |