互斥锁、条件变量和信号量是实现线程间同步的三种方式。在多线程程序访问临界资源时,可以对各个线程进行访问限制,每次只允许一个线程访问临界资源。条件变量相当于是互斥锁的一种补充,是线程中的东西,就是等待某一条件的发生,和信号一样。占有临界资源的线程在执行完对于资源的操作后,会发出“信号”,然后其它未占有资源的线程在感知到“信号”后就会抢占资源。
互斥锁的使用
需要的头文件:pthread.h
1)定义并初始化互斥锁
函数原型:pthread_mutex_t mutex;
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mattr)
参数说明:mutex互斥锁地址,mattr属性通常默认nullptr,可以用于设置互斥锁的特性。
互斥锁属性:
- PTHREAD_MUTEX_NORMAL,在同一线程中重复锁定互斥锁会导致死锁。如果某个线程尝试解除锁定的互斥锁不是由该线程锁定或未锁定,则将产生不确定的行为。
- PTHREAD_MUTEX_ERRORCHECK,提供错误检查。如果某个线程尝试重新锁定的互斥锁已经由该线程锁定,则将返回错误。如果某个线程尝试解除锁定的互斥锁不是由该线程锁定或者未锁定,则将返回错误。
- PTHREAD_MUTEX_RECURSIVE,一个线程可以多次锁定同一个互斥锁,互斥锁会保留一个锁定计数。线程首次成功获取互斥锁时,锁定计数会设置为 1。线程每重新锁定该互斥锁一次,锁定计数就增加 1。线程每解除锁定该互斥锁一次,锁定计数就减小 1。 锁定计数达到 0 时,该互斥锁即可供其他线程获取。如果某个线程尝试解除锁定的互斥锁不是由该线程锁定或者未锁定,则将返回错误。
2)互斥锁加锁
函数原型:int pthread_mutex_loc