semaphore

  1. 以一个停车场是运作为例。为了简单起见,假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆不受阻碍的进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入一辆,如果又离开两辆,则又可以放入两辆,如此往复。
    在这个 停车场系统 中,车位是公共资源,每辆车好比一个线程,看门人起的就是 信号量 的作用。

更进一步,信号量的特性如下:信号量是一个非负整数(车位数),所有通过它的线程(车辆)都会将该整数减一(通过它当然是为了使用资源),当该整数值为零时,所有试图通过它的线程都将处于等待状态。在信号量上我们定义两种操作: Wait(等待) 和 Release(释放)。 当一个线程调用Wait(等待)操作时,它要么通过然后将信号量减一,要么一直等下去,直到信号量大于一或超时。Release(释放)实际上是在信号量上执行加操作,对应于车辆离开停车场,该操作之所以叫做“释放”是因为加操作实际上是释放了由信号量守护的资源。

 

  1. 信号量与普通整型变量的区别:  
  2. ①信号量(semaphore)是非负整型变量,除了初始化之外,它只能通过两个标准原子操作:wait(semap) , signal(semap) ; 来进行访问;  
  3. ②操作也被成为PV原语(P来源于Dutch proberen"测试",V来源于Dutch verhogen"增加"),而普通整型变量则可以在任何语句块中被访问;   
  4. 信号量与互斥锁之间的区别:  
  5. 1. 互斥量用于线程的互斥,信号线用于线程的同步。    
  6.   
  7. 这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。    
  8.   
  9. 互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。    
  10.   
  11. 同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源    
  12.   
  13. 2. 互斥量值只能为0/1,信号量值可以为非负整数。    
  14.   
  15. 也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问。    
  16.   
  17. 3. 互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。  
  18. 信号量   
  19.   
  20. 信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。   
  21.   
  22. 信号量可以分为几类:    
  23. ² 二进制信号量(binary semaphore):只允许信号量取01值,其同时只能被一个线程获取。    
  24.   
  25. ² 整型信号量(integer semaphore):信号量取值是整数,它可以被多个线程同时获得,直到信号量的值变为0。    
  26.   
  27. ² 记录型信号量(record semaphore):每个信号量s除一个整数值value(计数)外,还有一个等待队列List,其中是阻塞在该信号量的各个线程的标识。当信号量被释放一个,值被加一后,系统自动从等待队列中唤醒一个等待中的线程,让其获得信号量,同时信号量再减一。    
  28.   
  29. 信号量通过一个计数器控制对共享资源的访问,信号量的值是一个非负整数,所有通过它的线程都会将该整数减一。如果计数器大于0,则访问被允许,计数器减1;如果为0,则访问被禁止,所有试图通过它的线程都将处于等待状态。    
  30.   
  31. 计数器计算的结果是允许访问共享资源的通行证。因此,为了访问共享资源,线程必须从信号量得到通行证, 如果该信号量的计数大于0,则此线程获得一个通行证,这将导致信号量的计数递减,否则,此线程将阻塞直到获得一个通行证为止。当此线程不再需要访问共享资源时,它释放该通行证,这导致信号量的计数递增,如果另一个线程等待通行证,则那个线程将在那时获得通行证。    
  32.   
  33. Semaphore可以被抽象为五个操作:    
  34. - 创建 Create    
  35.   
  36. - 等待 Wait:    
  37.   
  38. 线程等待信号量,如果值大于0,则获得,值减一;如果只等于0,则一直线程进入睡眠状态,知道信号量值大于0或者超时。    
  39.   
  40. -释放 Post    
  41.   
  42. 执行释放信号量,则值加一;如果此时有正在等待的线程,则唤醒该线程。    
  43.   
  44. -试图等待 TryWait    
  45.   
  46. 如果调用TryWait,线程并不真正的去获得信号量,还是检查信号量是否能够被获得,如果信号量值大于0,则TryWait返回成功;否则返回失败。    
  47.   
  48. -销毁 Destroy    
  49.   
  50. 信号量,是可以用来保护两个或多个关键代码段,这些关键代码段不能并发调用。在进入一个关键代码段之前,线程必须获取一个信号量。如果关键代码段中没有任何线程,那么线程会立即进入该框图中的那个部分。一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量,然后将Acquire Semaphore VI以及Release Semaphore VI分别放置在每个关键代码段的首末端。确认这些信号量VI引用的是初始创建的信号量。 动作\系统  
  51.  Win32  
  52.  POSIX  
  53.    
  54. 创建  
  55.  CreateSemaphore  
  56.  sem_init  
  57.    
  58. 等待  
  59.  WaitForSingleObject  
  60.  sem _wait  
  61.    
  62. 释放  
  63.  ReleaseMutex  
  64.  sem _post  
  65.    
  66. 试图等待  
  67.  WaitForSingleObject  
  68.  sem _trywait  
  69.    
  70. 销毁  
  71.  CloseHandle  
  72.  sem_destroy  
  73. 互斥量(Mutex)    
  74.   
  75. 互斥量表现互斥现象的数据结构,也被当作二元信号灯。一个互斥基本上是一个多任务敏感的二元信号,它能用作同步多任务的行为,它常用作保护从中断来的临界段代码并且在共享同步使用的资源。    
  76. Mutex本质上说就是一把锁,提供对资源的独占访问,所以Mutex主要的作用是用于互斥。Mutex对象的值,只有01两个值。这两个值也分别代表了Mutex的两种状态。值为0, 表示锁定状态,当前对象被锁定,用户进程/线程如果试图Lock临界资源,则进入排队等待;值为1,表示空闲状态,当前对象为空闲,用户进程/线程可以Lock临界资源,之后Mutex值减1变为0。    
  77.   
  78. Mutex可以被抽象为四个操作:    
  79.   
  80. - 创建 Create    
  81.   
  82. - 加锁 Lock    
  83.   
  84. - 解锁 Unlock    
  85.   
  86. - 销毁 Destroy    
  87.   
  88. Mutex被创建时可以有初始值,表示Mutex被创建后,是锁定状态还是空闲状态。在同一个线程中,为了防止死锁,系统不允许连续两次对Mutex加锁(系统一般会在第二次调用立刻返回)。也就是说,加锁和解锁这两个对应的操作,需要在同一个线程中完成。    
  89.   
  90. 不同操作系统中提供的Mutex函数: 动作\系统  
  91.  Win32  
  92.  Linyx  
  93.  Solaris  
  94.    
  95. 创建  
  96.  CreateMutex  
  97.  pthread_mutex_init  
  98.  mutex_init  
  99.    
  100. 加锁  
  101.  WaitForSingleObject  
  102.  pthread_mutex_lock  
  103.  mutex_lock  
  104.    
  105. 解锁  
  106.  ReleaseMutex  
  107.  pthread_mutex_unlock  
  108.  mutex_unlock  
  109.    
  110. 销毁  
  111.  CloseHandle  
  112.  pthread_mutex_destroy  
  113.  mutex_destroy  

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值