互斥锁操作 pthread_mutex_t mutex

互斥锁

创建一把锁:pthread_mutex_t mutex;

使用互斥锁缺点?

串行

互斥锁的使用步骤

1、创建互斥锁: pthread_mutex_t mutex;
2、初始化: pthread_mutex_init(&mutex, NULL);
3、找到线程共同操作的共享数据
4、加锁: pthread_mutex_lock(&mutex); // 阻塞线程
pthread_mutex_trylock(&mutex); // 如果锁上锁, 直接返回, 不阻塞
5、共享数据操作
6、解锁: pthread_mutex_unlock(&mutex);
阻塞在锁上的线程会被唤醒
7、销毁: pthread_mutex_destroy(&mutex);

互斥锁相关函数

初始化互斥锁

pthread_mutex_init(
pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr
);

销毁互斥锁

pthread_mutex_destroy(pthread_mutex_t *mutex);

加锁

pthread_mutex_lock(pthread_mutex_t *mutex);
参数mutex:
没有被上锁,当前线程会将这把锁锁上
被锁上了:当前线程阻塞
锁被打开之后,线程解除阻塞

试加锁, 失败返回, 不阻塞

pthread_mutex_trylock(pthread_mutex_t *mutex);
没有锁上:当前线程会给这把锁加锁
如果锁上了:不会阻塞,返回
if(pthread_mutex_trylock(&mutex)==0)
{
// 尝试加锁,并且成功了
// 访问共享资源
}
else
{
// 错误处理
// 或者 等一会,再次尝试加锁
}

解锁

pthread_mutex_unlock(pthread_mutex_t *mutex);

如果想使用互斥锁同步线程: 所有的线程都需要加锁!!!

##造成死锁的原因

自己锁自己:操作做完成之后, 一定要解锁

在访问其他共享数据的时候, 先把自己的锁解锁
所有的线程顺序的去访问共享数据

猜你喜欢

转载自blog.csdn.net/zxy131072/article/details/89633452