Skip to content

Latest commit

 

History

History
109 lines (82 loc) · 2.36 KB

互斥锁.md

File metadata and controls

109 lines (82 loc) · 2.36 KB

互斥锁

互斥锁也叫互斥量。当一个数据结合了锁。情况会变为是当你有锁时你才能操作该数据,没有时就无法操作

互斥锁类型

#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); // 销毁锁