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)停止 athread执行,它如何、在何处以及何时返回?

哪个线程在 ? 之后启用中断Wait()?在另一个线程调用之前thread,被调用的block()不应该返回wakeup(thread)

  • 但是其他线程如何运行?
  • 线程切换到底发生在哪里?
4

2 回答 2

1

block(thread)这样工作:

  1. 启用中断
  2. 使用某种等待机制(由操作系统提供或最简单情况下的忙等待)等待直到wakeup(thread)调用此线程。这意味着在这一点thread上将时间交给调度程序。
  3. 禁用中断和返回。
于 2012-03-16T21:03:32.363 回答
0

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

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

于 2014-06-24T13:40:26.763 回答