【发布时间】:2016-12-20 01:34:44
【问题描述】:
John C. Mitchell 的“编程语言概念”中的这段引文激励了我:
"原子性防止一个等待过程的单个语句被 与另一个在同一信号量上等待的单独语句交错。"
等待和信号操作需要是原子的,这通常由一些“较低”级别的获取锁机制强制执行 - 禁用中断、禁用抢占、测试和设置......但是,从概念上讲,这些锁如何以某种方式实现每个信号量实例的“私有”?
换句话说,是否允许例如一个线程在开始时获得锁,然后在对一个信号量执行等待操作的过程中被抢占,然后另一个线程在某个信号量的等待操作开始时获得锁?其他信号量并进入其等待操作的主体,使两个线程同时在不同信号量上的等待操作?或者,很快,两个不同信号量上的等待操作是否互斥?
我的观点是,如果线程在等待操作在一个信号量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:
...
所以...
是否允许在某个执行点抢占一个线程,同时在 //POINT OF PREEMPTION FOR THREAD 1!// 处对信号量 s1 执行等待操作,并将控制权转移到另一个执行信号量 s2 的等待操作的线程//线程 2 的继续点!//...
...或...
是否允许一个信号量的等待操作指令与另一个信号量的等待操作指令交错?
..或...
是否允许多个线程同时在不同信号量上等待操作?
很抱歉我的啰嗦,但我真的很难澄清我的问题。提前致谢。
【问题讨论】:
-
我无法理解您的要求。信号和信号量只是并发工具箱中的不同工具。 (还有其他。)不同的工具更适合不同的事情。
-
彼得森算法更像是一种学术练习。当您尝试实施它时,它做出的假设可能不一定得到保证。最好依靠为强制互斥而设计的硬件指令。
-
对不起,我的困惑。我试图澄清我的观点,所以我编辑了问题。我的问题更多的是关于信号量的实现,等待/信号操作的定义是否要求它们必须在物理上不可分割?
-
不要忘记,如果收到另一个信号,信号处理程序本身可能会被中断。
-
好的,但是如果我们禁用所有可屏蔽的中断,那么我们会阻止任何异步抢占,这是我的问题的重点(例如由计时器启动),并且控制转移只能通过进程的意志来执行当前使用的处理器(例如通过执行软件中断指令)。
标签: multithreading operating-system synchronization semaphore