使用test& set实现Counting Semaphore而不禁用中断

时间:2018-03-11 10:14:00

标签: process synchronization semaphore

我正在尝试使用Test& Set实现Counting信号量。如何在不禁用中断的情况下解决此代码中的死锁问题?是否可能没有其他解决办法?

void wait(semaphore *s){

while(test_and_set(&lock_wait)):
s->val--;
if(s->val<0){
    s->queue.enque(This_process);
    block();
  }
  lock_wait = false;
}
void signal(semaphore *s)
{
  while(test_and_set(&lock_signal));
  s->val++;
  if(s->val <= 0)
  {
    process p = s->queue.dequeue();
    wakeup(p);
  }
  lock_signal = false;  
}

1 个答案:

答案 0 :(得分:0)

请评论您的代码。还有一件事,你在实施时得到了什么?在这里添加输出,也就是兄弟!

虽然确实在一个处理器上关闭中断不足以保证多处理器系统中的原子内存访问(因为,正如您所提到的,其他处理器上的线程仍然可以访问共享资源),我们关闭部分中断多处理器信号量实现,因为我们不想在进行测试和设置时进行计划。

如果一个持有测试和集合的线程被取消调度,那么没有其他线程可以对信号量做任何事情(因为它的计数受到该测试和设置的保护)线程在睡着时正在使用(这不好)。为了保证不会发生这种情况,我们会在使用测试和设置时关闭处理器上的中断。