我被约翰·C·米切尔引用的“编程语言中的概念”的引文激励着:
“原子性防止一个等待过程的单个语句与相同信号量的上的另一个等待__的单个语句交织。”
等待和信号操作需要是原子的,这通常是由一些“较低”的机制来执行的:获取锁禁用中断、禁用抢占、测试和设置.但是,从概念上讲,对于每个信号量实例,这些锁在某种程度上是“私有”的?
换句话说,是否允许一个线程在开始时获得锁,然后在对一个信号量执行等待操作的过程中被抢占,然后另一个线程在对其他信号量的等待操作开始时获得锁,并进入其等待操作的主体,以便两个线程同时在不同的信号量上处于等待操作中?或者,很快,上的等待操作是否是两个不同的信号量相互排斥的?
我的观点是,如果线程在一个信号量 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:
...
所以..。
是否允许在某个执行点对线程1!//在//抢占点对信号量s1执行等待操作时抢占一个线程,并将控制传输到另一个线程,该线程在线程2!//的继续点处执行信号量s2的等待操作。
...or...
是否允许一个信号量的等待操作指令与另一个信号量的等待操作指令交织在一起?
..or...
是否允许多个线程同时在不同的信号量上进行等待操作?
对不起,我的话太少了,但我真的很难澄清我的问题。提前谢谢。
发布于 2016-12-20 09:22:51
是的,是允许的。使用两种不同的锁而不是对所有东西都使用相同的锁的原因之一是避免了像这样的不必要的依赖。
是否允许一个信号量的等待操作指令与另一个信号量的等待操作指令交织在一起?
绝对一点儿没错。
是否允许多个线程同时在不同信号量上进行等待操作?
绝对一点儿没错。
禁止任何这些事情都会对性能造成很大的伤害,而不会带来任何好处。争用是多线程性能的敌人。
https://stackoverflow.com/questions/41233644
复制相似问题