2012-03-16 105 views
3
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调用block()应该不会返回,直到另一个线程调用wakeup(thread)

  • 但是其他线程如何运行?
  • 线程切换发生在哪里?
+0

此代码从何而来? – 2012-03-16 21:04:38

+0

从演讲幻灯片... http://web.cecs.pdx.edu/~walpole/class/cs333/fall2006/slides/5.ppt – 2012-03-16 21:14:39

回答

1

block(thread)这样工作:

  1. 允许中断
  2. 使用某种类型的等待机制(由操作系统或忙等待在最简单的情况下提供)等到wakeup(thread)这个线程被调用。这意味着在这一点上thread会给调度器带来时间。
  3. 禁用中断和返回。
+0

等待机制使用**原子操作**(您可以,例如,在一个原子处理器指令中检查一个标志),以便您可以使用启用的中断。 – 2012-03-16 21:12:00

0

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

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