信号量是E.W.Dijkstra提出的方法,它使用1个整型变量来累计唤醒次数,供以后使用。1个信号量的取值可以为0,或为正值。
信号量有两种操作:
PV操作是原子操作:原子操作指1组相干联的操作要末都不中断地履行,要末都不履行。
如果不需要信号量的技术能力,有时可使用信号量的1个简化版本,称为互斥量。
互斥量是1个可以处于两态之1的变量:解锁和加锁,这样只需要用1个2进制位表示它,实际上通常使用1个整型量,0表示解锁,其他所有值表示加锁。
互斥量使用有两个进程:
与互斥量相干的主要函数:
线程调用 | 描写 |
---|---|
pthread_mutex_init | 创建1个互斥量 |
pthread_mutex_destroy | 撤消1个已存在的互斥量 |
pthread_mutex_lock | 取得1个锁或阻塞 |
pthread_mutex_trylock | 取得1个锁或失败 |
pthread_mutex_unlock | 释放1个锁 |
除互斥量以外,pthread提供了另外一种同步机制:条件变量。互斥量在允许或阻塞对临界区的访问上是很有用的,条件变量则允许线程由于1些未到达的条件而阻塞。绝大部份情况下这两种方法是1起使用的。
与条件变量相干函数
线程调用 | 描写 |
---|---|
pthread_cond_init | 创建1个条件变量 |
pthread_cond_destroy | 撤消1个条件变量 |
pthread_cond_wait | 阻塞以等待1个信号 |
pthread_cond_signal | 向另外一个线程发信号来唤醒它 |
pthread_cond_broadcast | 向多个线程发信号来让它们全部唤醒 |
摘自:
http://www.cnblogs.com/diyingyun/archive/2011/12/04/2275229.html
1. 互斥量用于线程的互斥,信号线用于线程的同步。
这是互斥量和信号量的根本区分,也就是互斥和同步之间的区分。
2. 互斥量值只能为0/1,信号量值可以为非负整数。
也就是说,1个互斥量只能用于1个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也能够完成1个资源的互斥访问。
3. 互斥量的加锁和解锁必须由同1线程分别对应使用,信号量可以由1个线程释放,另外一个线程得到。
互斥:是指某1资源同时只允许1个访问者对其进行访问,具有唯1性和排它性。但互斥没法限制访问者对资源的访问顺序,即访问是无序的。
同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已实现了互斥,特别是所有写入资源的情况一定是互斥的。少数情况是指可以允许多个访问者同时访问资源