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)。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值