测试和设置指令如何满足(或不满足)临界区方法的条件

Posted

技术标签:

【中文标题】测试和设置指令如何满足(或不满足)临界区方法的条件【英文标题】:How test-and-set instruction satisfies (or does not satisfy) conditions for critical section approach 【发布时间】:2014-09-12 11:47:41 【问题描述】:

我正在查看进程同步并遇到了测试和设置指令

boolean testAndSet (boolean *target)
  
     boolean rv = *target;
     *target = true;
     return rv;


main()

      do
      
          while( testAndSet( &lock ));

          //critical section
          lock = false;

          //remainder section
       while(true);

 

它以原子方式执行(即,每当发生对 testAndSet 的函数调用时,在函数返回之前都不会处理中断)。

现在我明白了这是如何消除互斥的(因为如果另一个进程正在执行它的关键部分,则等待进程会卡在 while 循环中)。但它如何满足 Progress 条件,更重要的是,它如何不满足有界缓冲条件?任何帮助将不胜感激..

【问题讨论】:

【参考方案1】:

为了取得进展,假设 PO 处于临界区,P1、P2 和 P3 正在等待。一旦 PO 离开,它就会将 lock 设置为 false,然后下一个进程退出 while 条件并进入临界区。 对于有限等待,我不确定,但如果可以说,具有高优先级的 P4 来并反复请求进入临界区。那么,P1,P2,P3 将永远没有机会进入该部分。因此,他们会无限等待。

【讨论】:

以上是关于测试和设置指令如何满足(或不满足)临界区方法的条件的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统编程5_条件变量与互斥锁

进程间通讯,临界区,互斥

临界区与竞态条件

线程同步与互斥详解

C++实现 生产者消费者模型

多线程程序的临界区