我是靠谱客的博主 哭泣短靴,最近开发中收集的这篇文章主要介绍linux线程互斥pthread_mutex_lock,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

线程同步:进行多线程编程,因为无法知道哪个线程会在什么时候对共享资源进行操作,因此让如何保护共享资源变得复杂,通过下面这些技术的使用,可以解决线程间对资源的竞争:

1、互斥量Mutex

2、信号灯semaphore

3、条件变量conditions

 

为什么需要互斥量:

Item *p = queue_list;

Queue_list = queue_list->next;

process_job(p);

free(p);

当线程1处理完Item *p = queue_list后,系统停止线程1的运行,改而运行线程2.线程2照样取出头结点,然后进行处理,最后释放了该结点。过了段时间,线程1重新得到运行。而这个时候,p所指向的结点已经被释放掉,而线程1对此毫无知晓。他会接着运行process_job(p)。而这将导致无法预料的后果!

对于这种情况系统给我们提供了互斥量。线程在取出头结点前必须要等待互斥量,如果此时有其他线程已经获得该互斥量,那么线程将阻塞在这里。只有等到其他线程释放掉该互斥量后,该线程才有可能得到该互斥量。互斥量从本质上说是一把钥匙,提供对共享资源的保护访问。

 

初始化:

在linux中,互斥量使用类型pthread_mutex_t表示。在使用前,要使用pthread_mutex_int进行初始化,并且在释放内存(free)前需要调用pthread_mutex_destory。

 

加锁:

对共享资源的访问,要使用互斥量进行加锁,如果互斥量已经上了锁,调用线程会阻塞,直到互斥量被解锁。

int pthread_mutex_lock(pthread_mutex_t *mutex)

int pthread_mutex_trylock(pthread_mutex_t *mutex)

 

返回值:成功返回0,出错则返回错误编码。

trylock是非阻塞调用模式,如果互斥量没被锁住,trylock函数将对互斥量加锁,并获得对共享资源的访问权限;如果互斥量被锁住了,trylock函数将不会阻塞等待而直接返回EBUSY,表示共享资源处于忙状态。

 

解锁:

在操作完成后,必须给互斥量解锁,也就是前面所示的释放。这样其他等待该锁的线程才有机会获得该锁,否则其他线程将会永远阻塞。

int pthread_mutex_unlock(pthread_mutex_t *mutex)

 

互斥量与信号量

1、mutex是一把钥匙,一个人拿了就可以进入房间,出来时把钥匙交给队列的第一个。

2、semaphore是一件可以容纳N人的房间,如果人不满就可以进去,如果人满了,就要等待有人出来。对于N=1的情况,称为binar semaphore。

3、binary semaphore与mutex的差异:

1)mutex要由获得锁的线程来释放(谁获得,谁释放)。而semaphore可以由其他线程释放。

2)初始状态可能不一样:mutex的初始值是1,而semaphore的初始值可能是0(或者1)。

 

最后

以上就是哭泣短靴为你收集整理的linux线程互斥pthread_mutex_lock的全部内容,希望文章能够帮你解决linux线程互斥pthread_mutex_lock所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(71)

评论列表共有 0 条评论

立即
投稿
返回
顶部