`
Sev7en_jun
  • 浏览: 1227545 次
  • 性别: Icon_minigender_1
  • 来自: 广州
博客专栏
84184fc0-d0b6-3f7f-a3f0-4202acb3caf5
Apache CXF使用s...
浏览量:111473
社区版块
存档分类
最新评论

理解信号量(Semaphore)与互斥锁

    博客分类:
  • Java
 
阅读更多
FROM: http://www.cnblogs.com/diyingyun/archive/2011/12/04/2275229.html
信号量与普通整型变量的区别:
①信号量(semaphore)是非负整型变量,除了初始化之外,它只能通过两个标准原子操作:wait(semap) , signal(semap) ; 来进行访问;
②操作也被成为PV原语(P来源于Dutch proberen"测试",V来源于Dutch verhogen"增加"),而普通整型变量则可以在任何语句块中被访问; 
信号量与互斥锁之间的区别:
1. 互斥量用于线程的互斥,信号线用于线程的同步。  

这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。  

互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。  

同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源  

2. 互斥量值只能为0/1,信号量值可以为非负整数。  

也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问。  

3. 互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。
信号量 

信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。 

信号量可以分为几类:  
² 二进制信号量(binary semaphore):只允许信号量取0或1值,其同时只能被一个线程获取。  

² 整型信号量(integer semaphore):信号量取值是整数,它可以被多个线程同时获得,直到信号量的值变为0。  

² 记录型信号量(record semaphore):每个信号量s除一个整数值value(计数)外,还有一个等待队列List,其中是阻塞在该信号量的各个线程的标识。当信号量被释放一个,值被加一后,系统自动从等待队列中唤醒一个等待中的线程,让其获得信号量,同时信号量再减一。  

信号量通过一个计数器控制对共享资源的访问,信号量的值是一个非负整数,所有通过它的线程都会将该整数减一。如果计数器大于0,则访问被允许,计数器减1;如果为0,则访问被禁止,所有试图通过它的线程都将处于等待状态。  

计数器计算的结果是允许访问共享资源的通行证。因此,为了访问共享资源,线程必须从信号量得到通行证, 如果该信号量的计数大于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
互斥量(Mutex)  

互斥量表现互斥现象的数据结构,也被当作二元信号灯。一个互斥基本上是一个多任务敏感的二元信号,它能用作同步多任务的行为,它常用作保护从中断来的临界段代码并且在共享同步使用的资源。  
Mutex本质上说就是一把锁,提供对资源的独占访问,所以Mutex主要的作用是用于互斥。Mutex对象的值,只有0和1两个值。这两个值也分别代表了Mutex的两种状态。值为0, 表示锁定状态,当前对象被锁定,用户进程/线程如果试图Lock临界资源,则进入排队等待;值为1,表示空闲状态,当前对象为空闲,用户进程/线程可以Lock临界资源,之后Mutex值减1变为0。  

Mutex可以被抽象为四个操作:  

- 创建 Create  

- 加锁 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)和互斥锁(Mutex)的概念。 1. **信号量**:信号量是一种计数器,用于管理共享资源的访问。它可以是整数值,表示资源的数量,或者作为二进制信号量(值只能为0或1),...

    C语言并发控制:信号量与互斥锁的实现与应用

    ### C语言并发控制:信号量与互斥锁的实现与应用 #### 一、引言 C语言作为一种经典的编程语言,自20世纪70年代初由丹尼斯·里奇在贝尔实验室开发以来,就因其高效性、灵活性以及强大的硬件控制能力而受到广泛欢迎...

    C语言信号量同步与互斥生产者消费者互斥锁读写者问题哲学家就餐问题课程设计

    C语言信号量同步与互斥生产者消费者互斥锁读写者问题哲学家就餐问题课程设计 本课程设计旨在通过C语言编程来解决信号量机制下的同步、互斥、生产者消费者问题、哲学家就餐问题和读写者问题。 一、信号量机制 信号...

    mutex和semaphore互斥程序实例

    `mutex`(互斥锁)和`semaphore`(信号量)都是用于实现线程同步和互斥的工具,确保同一时间只有一个线程可以访问特定的共享资源。本文将深入探讨这两种机制及其在实际编程中的应用。 一、互斥锁(Mutex) 互斥锁是...

    互斥锁、条件变量、信号量总结

    互斥锁、条件变量和信号量是操作系统中用于线程同步和资源管理的重要工具,尤其在多线程和多进程编程中发挥着关键作用。这些机制确保了共享资源的有序访问,防止数据竞争和死锁等问题的发生。 首先,互斥锁(Mutex...

    多线程 教程 各种锁 半成品的CAS 临界区 信号量 事件 互斥锁 队列

    本教程将深入探讨多线程相关的知识点,包括各种锁机制、条件变量、半成品的CAS操作、临界区、信号量、事件、互斥锁以及队列。 **多线程**:多线程是操作系统提供的一种并发执行机制,一个进程可以包含多个线程,每...

    互斥锁示例代码

    除了互斥锁,Linux还提供了信号量(Semaphore)、条件变量(Condition Variable)等同步机制,可以根据不同的应用场景选择合适的方法。 总之,互斥锁是保证多线程并发环境下数据安全的重要工具,通过理解其原理和...

    使用信号量(Semaphore)实现线程的同步

    二进制信号量的值只能为0或1,相当于一个互斥锁,确保同一时间只有一个线程能访问资源。计数信号量的值可以为任何非负整数,可以控制同时访问资源的线程数量。 在实际应用中,信号量常用于以下场景: - **生产者-...

    Linux互斥锁、条件变量和信号量[归类].pdf

    Linux 互斥锁、条件变量和信号量 在 Linux 多线程编程中,为了防止多个线程同时访问共享资源,Linux 提供了互斥锁、条件变量和信号量来保护共享资源。 一、互斥锁 互斥锁是一种信号量,常用来防止两个进程或线程...

    用有名信号量和匿名信号量实现进程互斥

    在C语言中,我们使用`<semaphore.h>`头文件中的函数来操作信号量。下面是一些关键函数: 1. **sem_init**: 这个函数用于初始化一个匿名信号量。它接受三个参数:指向信号量结构体的指针`sem`,一个标志`pshared`,...

    信号量同步等待机制 semaphore wait-and-signal

    我们不仅需要使用互斥锁来保护队列的访问,还需要使用信号量来确保队列不会溢出或空闲。 ```plaintext // 初始化信号量 int empty = N; int full = 0; // 生产者函数 void producer() { while (true) { ...

    基于Linux的实现进程的信号量互斥申请

    3. **互斥锁的概念与实现**:在多进程环境中,互斥锁是一种通过信号量实现的机制,确保同一时间只有一个进程访问特定资源。当一个进程获得锁后,其他试图获取该锁的进程将被阻塞,直到锁被释放。 4. **PV操作**:...

    基于consul的分布式锁工具,包含:互斥锁、信号量等工具

    常见的分布式锁类型有互斥锁(Mutex)和信号量(Semaphore)。 - **互斥锁**:互斥锁确保同一时间只有一个线程可以访问资源,其他试图获取锁的线程必须等待锁被释放。在Java中,通常通过`java.util.concurrent....

    VXWORKS实时操作系统中信号量用于多任务同步与互斥的讨论.pdf

    信号量(Semaphore)是操作系统中用于多任务同步和互斥的机制之一,其基本思想是通过一个或多个信号量变量来控制对共享资源的访问。信号量可以被看作是一个计数器,用来表示资源的可用数。当任务需要访问共享资源时...

    Python的互斥锁与信号量详解

    本文通过多个实例代码详细介绍了互斥锁和信号量在Python中的实现与应用,对于理解多线程同步机制及其在实际问题中的运用有着重要的帮助,对于学习多线程编程具有参考价值。希望本文内容能够帮助更多的人深入理解和...

    基于Redis构建的分布式信号量和互斥量 .zip

    互斥锁和信号量是阻塞的,而不是轮询的,并且有一个公平的队列,按照先到先得的原则为进程提供服务。它还可以有一个可选的超时时间,超过该时间后锁会自动解锁,以防止客户端死亡。更多信息请参阅维基百科。v0.3.0 ...

    使用信号量和关键段实现多线程的同步与互斥

    通过以上知识点,我们可以理解如何使用C++中的信号量和关键段来解决读者、写者问题,实现不同数量的读者和写者之间的同步与互斥。项目中的`ReaderWriter`文件可能包含了具体的代码实现,包括线程创建、信号量初始化...

    c语言信号量的使用实例

    - **互斥锁**:信号量也可以用作简单的互斥锁,确保同一时间只有一个进程能够访问共享资源。 #### 七、总结 通过以上介绍可以看出,信号量是C语言中非常重要的同步机制之一,它可以帮助开发者解决多进程环境下的...

    LINUX内核信号量设计与实现.rar

    在Linux内核中,信号量分为两种类型:互斥信号量(mutex)和普通信号量(semaphore)。互斥信号量主要用于实现线程之间的互斥访问,而普通信号量则允许有限数量的进程同时访问资源。 1. **互斥信号量(Mutex)**: ...

Global site tag (gtag.js) - Google Analytics