在执行期间,两个不同信号量上的两个独立线程执行的两个等待操作是否可以交错?

时间:2016-12-20 01:34:45

标签: multithreading operating-system synchronization semaphore

我的动机是来自"编程语言中的概念"作者:John C. Mitchell:

  

" Atomicity会阻止一个等待过程的单个语句   与同一信号量上的另一个等待的个别陈述交错。"

等待并且信号操作需要是原子的,这通常是由某些"较低的"获取锁的级别机制 - 禁用中断,禁用抢占,测试和设置......但是,从概念上讲,这些锁如何以某种方式“私有”#34;对于每个信号量实例?

换句话说,是否允许例如一个线程在开始时获取锁定,然后在一个信号量上执行等待操作的中间被抢占,之后另一个线程在某些信号的等待操作开始时获取锁定其他信号量并进入其等待操作的主体,以便两个线程同时在不同信号量的等待操作中?或者,不久,两个不同的信号量上的等待操作是否相互排斥?

我的观点是,如果线程在一个信号量 s1上的等待操作中获取锁定,是否允许另一个线程在另一个信号量的等待操作中同时获取锁定 s2?我强调这是两个不同的信号量实例,而不是同一个。

例如:

class Semaphore {
...
    public:
        void wait();
...
}

 void Semaphore::wait(){
      lock();
      //POINT OF CONTINUATION FOR THREAD 2!//
      if(--val<0){
          //POINT OF PREEMPTION FOR THREAD 1!//
          block();
      }
      unlock();
 }

 Semaphore s1;
 Semaphore s2:
 ...

因此...

在某个执行点是否允许一个线程被抢占,同时在信号量s1上执行等待操作// POINT OF PREEMPTION FOR THREAD 1!//,并控制转移到执行信号量s2等待操作的另一个线程//线索的连续点2!// ...

...或...

是否允许来自一个信号量的等待操作指令与来自另一个信号量的等待操作指令交错?

...或...

是否允许多个线程同时在不同的信号量上进行等待操作?

对不起我的啰嗦,但我真的很难澄清我的问题。提前谢谢。

1 个答案:

答案 0 :(得分:1)

是的,它被允许了。使用两个不同的锁而不是对所有内容使用相同的锁的原因之一是避免不必要的依赖性。

  

是否允许来自一个信号量的等待操作指令与来自另一个信号量的等待操作指令交错?

绝对

  

是否允许多个线程同时在不同的信号量上进行等待操作?

绝对

禁止任何这些事情会严重影响性能,无益。争用是多线程性能的敌人。