互斥锁:
1、互斥锁基本原理:
互斥锁是一个二元变量,其状态为开锁(允许0)和上锁(禁止1),将某个共享资源与某个特定互斥锁在逻辑上绑定(要申请该资源必须先获取锁)。
(1)访问公共资源前,必须申请该互斥锁,若处于开锁状态,则申请到锁对象,并立即占有该锁,以防止其他线程访问该资源;如果该互斥锁处于锁定状态,则阻塞当前线程。
(2)只有锁定该互斥锁的进程才能释放该互斥锁,其他线程试图释放无效。
2、初始化互斥锁:
使用之前,需要定义互斥锁,使用函数:pthread_mutex_t lock;进行定义。
初始化锁:
extern int pthread_mutex_init(pthread_mutex_t *_mutex,_const pthread_mutex_mutexattr_t* _mutexattr)
第一个参数mutex指要初始化的互斥锁的指针。
第二个参数mutexattr是指向对象的指针,如果该属性为空,则使用默认的属性。
全用宏PTHREAD_MUTEX_INITIALIZER来初始化静态分配的互斥锁(全局锁);
3、申请互斥锁
如果一个线程要占用共享资源,必须先申请对应互斥锁,使用函数:
extern int pthread_mutex_lock(pthread_mutex* _mutex)以阻塞方式申请互斥锁;
extern int pthread_mutex_trylock(pthread_mutex* _mutex)以非阻塞方式申请互斥锁;
若申请成功,返回0,否则,返回一个错误编号。
<注:参数都是要申请互斥锁的指针>
4、释放互斥锁
释放互斥锁用函数:
extern int pthread_mutex_unlock(pthread_mutex_t* _mutex)
参数mutex是指向要解锁的互斥锁的指针
释放只能由占有该互斥锁的线程完成,如果释放成功,返回0,失败返回错误编号。
unlock中的释放锁操作同样只用一条指令实现,以保证它的原子性。
5、例:如下代码:
- #include<stdio.h>
- #include<pthread.h>
- #include<string.h>
- #include<sys/types.h>
- #include<unistd.h>