概述
线程同步:进行多线程编程,因为无法知道哪个线程会在什么时候对共享资源进行操作,因此让如何保护共享资源变得复杂,通过下面这些技术的使用,可以解决线程间对资源的竞争:
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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复