互斥锁:适用于线程可用的资源只有一个,需要互斥访问的情况
条件变量:适用线程之间构成条件等待关系的情况
读写锁:提高互斥锁在数据库系统数据访问(大量读,较少写)等应用领域的效率
华清远见.创客学院.应用程序设计综合教程.p133
2.1 互斥锁
2.1.1 互斥锁原理
互斥锁以排他方式防止共享数据被并发访问。互斥锁是一个二元变量,只有锁定(禁止1)和解锁(允许0)两种状态,互斥锁可以看作是特殊意义的全局变量,因为在同一时刻只有一个线程能够对互斥锁进行操作。
将某个共享资源与某个特定互斥锁在逻辑上绑定,即要申请该资源必须先获取锁。对该共享资源的访问操作如下:
(1) 首先申请互斥锁,如果该互斥锁处于锁定状态,默认阻塞当前线程;如果处于解锁状态,则申请到该锁并立即占有该锁,使锁处于锁定状态防止其他线程访问该资源。
(2) 只有锁定该互斥锁的线程才能释放该互斥锁,其他线程试图释放操作无效。
2.1.2 互斥锁基本操作函数
功能 函数
初始化互斥锁 pthread_mutex_init
阻塞申请互斥锁 pthread_mutex_lock
非阻塞申请互斥锁 pthread_mutex_trylock
释放互斥锁 pthread_mutex_unlock
销毁互斥锁 pthread_mutex_destroy
使用互斥锁前先定义该互斥锁(全局变量)
pthread_mutex_t lock;
1
在使用互斥锁以前,必须首先对它进行初始化
静态分配的互斥锁:置为常量PTHREAD_MUTEX_INITIALIZER,属性为NULL,也可以调用pthread_mutex_init函数
动态分配的互斥锁:例如通过调用malloc函数分配的互斥锁,只能调用pthread_mutex_init,且在释放内存前需要调用pthread_mutex_destroy
1
2
3
(1) 初始化互斥锁
int pthread_mutex_init (pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
形参:
mutex 要初始化的互斥锁的指针
mutexattr 要初始化的互斥锁的属性;NULL表示使用默认属性
其他:也可使用宏初始化静态分配的互斥锁
#define PTHREAD_MUTEX_INITIALIZER {{0,}}
pthread_mutex_t mp = PTHREAD_MUTEX_INITIALIZER;
返回值:成功返回0,否则返回一个错误编号
1
2
3
4
5
6
7
8
9
(2) 销毁互斥锁
调用pthread_mutex_init初始化的互斥锁,在释放内存前需要调用pthread_mutex_destroy
int pthread_mutex_destroy (pthread_mutex_t *mutex);
形参:
mutex 指向要初始化的互斥锁的指针
返回值:成功返回0,否则返回一个错误编号
1
2
3
4
(3) 阻塞方式申请互斥锁
int pthread_mutex_lock (pthread_mutex_t *mutex);
说明:如果一个线程要占用一个共享资源,必须先申请一个对应的互斥锁
返回值:成功返回0,否则返回一个错误编号
1
2
3
(4) 非阻塞方式申请互斥锁
int pthread_mutex_trylock (pthread_mutex_t *mutex);
返回值:成功返回0,否则返回一个错误编号,以指明错误
1
(5) 释放互斥锁
int pthread_mutex_unlock (pthread_mutex_t *mutex);
说明:释放操作只能有占有该互斥锁的线程完成
返回值:成功返回0,否则返回一个错误编号
https://blog.csdn.net/baidu_35692628/article/details/69356675