互斥型信号量必须是同一个任务申请,同一个任务释放,其他任务释放无效。同一个任务可以递归申请。
二进制信号量实现任务互斥:
二进制信号量实现任务同步:
理解互斥量和信号量 作者: JuKevin
互斥量(Mutex)
- 加锁 Lock
- 解锁 Unlock
- 销毁 Destroy
Mutex被创建时可以有初始值,表示Mutex被创建后,是锁定状态还是空闲状态。在同一个线程中,为了防止死锁,系统不允许连续两次对Mutex加锁(系统一般会在第二次调用立刻返回)。也就是说,加锁和解锁这两个对应的操作,需要在同一个线程中完成。
不同操作系统中提供的Mutex函数: 动作/系统
Win32
Linyx
Solaris
创建
CreateMutex
pthread_mutex_init
mutex_init
加锁
WaitForSingleObject
pthread_mutex_lock
mutex_lock
解锁
ReleaseMutex
pthread_mutex_unlock
mutex_unlock
销毁
CloseHandle
pthread_mutex_destroy
mutex_destroy
信号量
信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。
信号量可以分为几类:
二进制信号量(binary semaphore):
整型信号量(integer semaphore)
记录型信号量(record semaphore)
计数器计算的结果是允许访问共享资源的通行证。因此,为了访问共享资源,线程必须从信号量得到通行证, 如果该信号量的计数大于0,则此线程获得一个通行证,这将导致信号量的计数递减,否则,此线程将阻塞直到获得一个通行证为止。当此线程不再需要访问共享资源时,它释放该通行证,这导致信号量的计数递增,如果另一个线程等待通行证,则那个线程将在那时获得通行证。
Semaphore可以被抽象为五个操作:
- 创建 Create
- 等待 Wait:
线程等待信号量,如果值大于0,则获得,值减一;如果只等于0,则一直线程进入睡眠状态,知道信号量值大于0或者超时。
-释放 Post
执行释放信号量,则值加一;如果此时有正在等待的线程,则唤醒该线程。
-试图等待 TryWait
如果调用TryWait,线程并不真正的去获得信号量,还是检查信号量是否能够被获得,如果信号量值大于0,则TryWait返回成功;否则返回失败。
-销毁 Destroy
信号量,是可以用来保护两个或多个关键代码段,这些关键代码段不能并发调用。在进入一个关键代码段之前,线程必须获取一个信号量。如果关键代码段中没有任何线程,那么线程会立即进入该框图中的那个部分。一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量,然后将Acquire Semaphore VI以及Release Semaphore VI分别放置在每个关键代码段的首末端。确认这些信号量VI引用的是初始创建的信号量。 动作/系统
Win32
POSIX
创建
CreateSemaphore
sem_init
等待
WaitForSingleObject
sem _wait
释放
ReleaseMutex
sem _post
试图等待
WaitForSingleObject
sem _trywait
销毁
CloseHandle
sem_destroy
互斥量和信号量的区别
1. 互斥量用于线程的互斥,信号量用于线程的同步。 ——
2.互斥量无法保证线程对资源的有序访问,信号量可以。
互斥
同步
3. 互斥量值只能为0/1,信号量值可以为非负整数。
4. 互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到
====
http://topic.csdn.net/u/20090317/02/51AAB1DC-4DF4-4B6B-A0CB-A46D2602074F.html