信号量与互斥锁

号量(semaphore)
信号量是E.W.Dijkstra提出的方法,它使用一个整型变量来累计唤醒次数,供以后使用。一个信号量的取值可以为0,或者为正值。 
信号量有两种操作:


P(wait):检查其值是否大于0,若大于0,则将其值减1; 若等于0:则进程将睡眠。
V(signal):信号量的值加1
PV操作是原子操作:原子操作指一组相关联的操作要么都不间断地执行,要么都不执行。


互斥量(mutex)
如果不需要信号量的技术能力,有时可以使用信号量的一个简化版本,称为互斥量。 
互斥量是一个可以处于两态之一的变量:解锁和加锁,这样只需要用一个二进制位表示它,实际上通常使用一个整型量,0表示解锁,其他所有值表示加锁。 
互斥量使用有两个过程:


mutex_lock:当一个线程(或进程)需要访问临界区时,如果该互斥量当前是解锁的(即临界区可用)此调用成功,调用线程可以自由进入该临界区。
mutex_unlock:如果该互斥量已经加锁,调用线程被阻塞,直到在临界区中的线程完成并调用mutex_unlock。
与互斥量相关的主要函数:


线程调用 描述
pthread_mutex_init 创建一个互斥量
pthread_mutex_destroy 撤销一个已存在的互斥量
pthread_mutex_lock 获得一个锁或阻塞
pthread_mutex_trylock 获得一个锁或失败
pthread_mutex_unlock 释放一个锁
除互斥量之外,pthread提供了另一种同步机制:条件变量。互斥量在允许或阻塞对临界区的访问上是很有用的,条件变量则允许线程由于一些未达到的条件而阻塞。绝大部分情况下这两种方法是一起使用的。


与条件变量相关函数


线程调用 描述
pthread_cond_init 创建一个条件变量
pthread_cond_destroy 撤销一个条件变量
pthread_cond_wait 阻塞以等待一个信号
pthread_cond_signal 向另一个线程发信号来唤醒它
pthread_cond_broadcast 向多个线程发信号来让它们全部唤醒
信号量与互斥量的区别
摘自: 
http://www.cnblogs.com/diyingyun/archive/2011/12/04/2275229.html 
1. 互斥量用于线程的互斥,信号线用于线程的同步。 
这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。 
2. 互斥量值只能为0/1,信号量值可以为非负整数。 
也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问。 
3. 互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。


互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。 
同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/u011391629/article/details/54351968
本文已收录于以下专栏:Linux学习笔记

https://blog.youkuaiyun.com/u011391629/article/details/54351968

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值