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

理解信号量(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
 
分享到:
评论

相关推荐

    Java信号量Semaphore

    Semaphore  Semaphore分为单值和多值两种,前者只能被一个线程获得,...单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场

    Python semaphore evevt生产者消费者模型原理解析

    线程锁相当于同时只能有一个线程申请锁,有的场景无数据修改互斥要求可以同时让多个线程同时运行,且需要限制并发线程数量时可以使用信号量 import threading, time, queue def test(name): semaphore.acquire() ...

    Linux内核源码深度解析与开发实战视频.zip

    19:可睡眠锁:信号量semaphore_rec 20:可睡眠锁:读写信号量rwsem_rec 21:可睡眠锁:完成变量completion_rec 22:可睡眠锁:SRCUsleepable_read-copy-update_rec 23:原子操作_rec 24:内存屏障_rec ...........

    生产者-消费者模型模拟进程调度,带报告,课程设计

    2、用信号量机制解决进程(线程)的同步与互斥问题。 二、实验目的 1.掌握基本的同步互斥算法,理解生产者和消费者模型。 2.了解Windows 2000/XP中多线程的并发执行机制,线程间的同步和互斥。 3.学习使用Windows ...

    Linux下的“锁”事儿

    比较经典的有原子操作、spin_lock(自旋锁)、mutex(互斥锁)、semaphore(信号量)等。  原子操作  原子操作,也是数据库事务的一大特性。是该操作绝不会在执行完之前被任何任务或者事件终止,要不全部执行,...

    NET多线程同步方法详解

    1) 互斥(Mutex), 信号量(Semaphore), 事件(AutoResetEvent/ManualResetEvent)2) 线程池 除了以上的这些对象之外实现线程同步的还可以使用Thread.Join方法。这种方法比较简单,当你在第一个线程运行时想等待第二个...

    操作系统课内实习,模拟生产者、消费者模型

    能学到什么:调用了Qt多线程类库QThread进行实现,并利用了信号量、线程锁等模拟操作系统对临界区资源的访问,输入输出缓冲区的界面可视化 阅读建议:结合代码及相关文档对生产者消费者模型进行理解。

    生产者-消费者:一个生产者和n个消费者问题(m个元素和共享内存)

    互斥锁:0 || 1,初始值为1(对于共享的results.txt文件) 操作方式: semDown(semaphore):将信号量的值减一 semOpN(semaphore,value):设置信号量的值 semWaitUntilZero(semaphore):阻塞过程,直到信号...

    ThreadX API查询手册.chm

    互斥锁相关API tx_mutex_create, tx_mutex_delete, tx_mutex_get, tx_mutex_info_get, tx_mutex_prioritize, tx_mutex_put. 队列相关API tx_queue_create, tx_queue_delete, tx_queue_flush, tx_queue_front_send...

    python基础9_1-进程、线程、守护线程、全局解释器锁、生产者消费者模型

    Queues/Pipes/Managers进程锁进程池3、线程(thread)语法join函数daemon(守护线程)线程锁之Lock(互斥锁mutex)/RLock(递归锁)/Semaphore(信号量)EventQueue生产者消费者模型4、进程和线程的关系区别 1、Python GIL...

    giCell zlg-gui

    提供任务(Task)、互斥锁(Mutex)、信号量(Semaphore)、位域标志(Flag)、 定时器(Timer)、优先级消息(Message)和环形队列(Ring buffer)内核对象; 6. 任何内核对象用一整数ID标识,而非指针,从而可...

    操作系统课程设计(生产者-消费者,存储管理,虚拟存储器

    2.在Windows中,常见的同步对象有:信号量(Semaphore)、互斥量(Mutex) 。 使用这些对象都分为三个步骤,一是创建或者初始化; 接着请求该同步对象,随即进入临界区,这一步对应于互斥量的上锁;最后释放该同步对象,...

    C#实现多线程的同步方法实例分析

    本文主要描述在C#中线程同步的方法。线程的基本概念网上资料也很多就不再赘述了。直接接入 主题,在多线程开发的应用...1) 互斥(Mutex), 信号量(Semaphore), 事件(AutoResetEvent/ManualResetEvent) 2) 线程池 除了以上

    个人总结的深入java多线程开发

    6)信号量Semaphore 31 7)ReentrantLock可重入的互斥锁定 Lock 32 8)阻塞队列BlockingQueue 34 9)已完成任务队列CompletionService 36 10)计时器CountDownLatch 37 11)周期性同步工具CyclicBarrier 38 12)异步计算的...

    C#实现多线程的同步方法详解

    本文主要描述在C#中线程同步的方法。线程的基本概念网上资料也很多就不再...系统内核对象1)互斥(Mutex),信号量(Semaphore),事件(AutoResetEvent/ManualResetEvent)2)线程池除了以上的这些对象之外实现线程同步的还可

    Python中的进程间通信

    基于信号量(Semaphore)的IPC2 基于信号(Signal)的IPC3.基于管道(Pipe)的IPC4. 基于有名管道(fifo)的IPC5.基于消息队列(Queue)的IPC6.基于共享内存的IPC7.基于套接字(Socket)的IPC8.基于临时文件(File...

    用vc编写简单操作系统教程

    //读者信号量 共允许3个读者同时进行 //线程体 bool who[3]={false}; DWORD WINAPI ReaderThreadFun(PVOID param) { CReader_WriterDlg * pWnd=(CReader_WriterDlg *)param; int iStep = 0; //申请信号量 if...

    生产者和消费者问题程序

    在Windows中,常见的同步对象有:信号量(Semaphore)、互斥量(Mutex)、临界段(CriticalSection)等。使用这些对象都分为三个步骤,一是创建或者初始化:接着请求该同步对象,随即进入临界区,这一步对应于互斥量的上锁...

    操作系统课程设计生产者和消费者问题源代码

    在Windows中,常见的同步对象有:信号量(Semaphore)、互斥量(Mutex)、临界段(CriticalSection)等。使用这些对象都分为三个步骤,一是创建或者初始化:接着请求该同步对象,随即进入临界区,这一步对应于互斥量的上锁...

    《计算机操作系统》期末复习指导

    •信号量(Semaphore)及PV操作 PV操作能够实现对临界区的管理要求。它由P操作原语和V操作原语组成,对信号量进行操作,具体定义如下: P(S):①将信号量S的值减1,即S=S-1; ②如果S 0,则该进程...

Global site tag (gtag.js) - Google Analytics