Wait / Signal(信号量)实现伪代码如何“工作”?

时间:2012-03-16 20:51:11

标签: semaphore context-switch blocked-threads

Wait(semaphore sem) {                           
  DISABLE_INTS
    sem.val--
    if (sem.val < 0){
      add thread to sem.L
      block(thread)
    }
  ENABLE_INTS

Signal(semaphore sem){
  DISABLE_INTS
    sem.val++
    if (sem.val <= 0) {
      th = remove next
         thread from sem.L
      wakeup(th)
    }
  ENABLE_INTS

如果block(thread)停止执行thread,它将返回的方式,位置和时间?

哪个线程启用Wait()之后的中断? 调用thread的{​​{1}}在另一个线程调用block()之前不应该返回!

  • 但是其他线程如何运行?
  • 线程切换到底发生了什么?

2 个答案:

答案 0 :(得分:1)

block(thread)就是这样:

  1. 启用中断
  2. 使用某种等待机制(由操作系统提供或在最简单的情况下忙等待)等待,直到调用此线程上的wakeup(thread)。这意味着在这一点thread产生了它到调度程序的时间。
  3. 禁用中断并返回。

答案 1 :(得分:0)

是的, UP DOWN 在从不同的线程调用时非常有用,但是用一个线程调用它们并非不可能 - 如果你用一个线程启动信号量值&gt; 0,然后相同的线程可以进入临界区并执行DOWN(之前)和UP(之后)。初始化信号量的值告诉一次有多少线程可以进入临界区,可能是1(互斥)或任何其他正数。

如何创建线程?这不会在演讲幻灯片中显示,因为这只是信号量如何使用伪代码的原理。但是,如何在应用程序中使用这些信号量是一个完全不同的故事。