互斥锁也叫互斥量。当一个数据结合了锁。情况会变为是当你有锁时你才能操作该数据,没有时就无法操作
#include <pthread.h>
pthread_mutex_t mutex; // 创建一把锁
#include <pthread.h>
int pthread_mutex_init(
pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
形参 | 描述 |
---|---|
mutex | 指向要初始化的互斥锁指针 |
attr | 指针类型,为要初始化的互斥锁定义属性,如果为NULL则为默认属性 |
restrict是将该变量变为与其他变量不关联。比如有指针p指向一块区域x。然后让s=p,此时s无法访问区域x因为p被restrict修饰了。
于此同时可以使用PTHREAD_MUTEX_INITIALIZER
来初始化锁。
#include <pthread.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 初始化锁mutex
#include <pthread.h>
int pthread_mutex_destroy(pthread_mutex_t *mutex);
#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
- 如果加锁时上锁了,则线程会一直阻塞在这个位置
- 锁被打开的时候解除阻塞
#include <pthread.h>
int pthread_mutex_trylock(pthread_mutex_t *mutex);
- 未被锁上:当前线程会给这把锁加锁
- 锁上了:不会阻塞,直接返回
#include <pthread.h>
if(pthread_mutex_trylock(&mutex) == 0)
{
// try lock
// 访问共享资源
}
else
{
// error handler
// 或者等一会,再次尝试
}
#include <pthread.h>
int pthread_mutex_unlock(pthread_mutex_t *mutex);
互斥量的特点: 多个线程访问,共享的数据是串行访问的。
- 互斥量使用步骤:
- 创建互斥锁
- 初始化
- 找到线程共同操作的共享数据
- 加锁
- 操作共享数据(注:在临界区之间上锁临界区越小越好)
- 解锁
- 如果此时有线程就缺一把锁(阻塞在锁上)此时会被唤醒。
- 销毁
pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL); // 此时mutex是1即可用
pthread_mutex_lock(&mutex); // 此时mutex变为0
pthread_mutex_trylock(&mutex); // 若加上锁则直接返回,不阻塞
// do something
pthread_mutex_unlock(&mutex); // mutex变为1,锁可用
pthread_mutex_destroy(&mutex); // 销毁锁