互斥代码

时间:2017-10-22 19:24:54

标签: multithreading thread-safety mutual-exclusion

我怎么知道代码在关键部分是互斥的?我理解这个概念,但是当涉及到代码跟踪时,我很难识别出互斥的代码。下面是有问题的代码段......

// flag[0] and [1] start as true

Thread 1
for(;;) {
    flag[1] = false;
    while(flag[2] == false) 
        flag[1] = true;
    flag[1] = false;
    // critical section
    flag[1] = true;
    // exit critical 
}

Thread 2
for(;;) {
    flag[2] = false;

    while(flag[1] == false);

    // critical section
    flag[2] = true;
    // exit critical 
}

这很糟糕,所以对任何关于互斥的一般见解表示赞赏。

1 个答案:

答案 0 :(得分:0)

  

我很难识别互斥代码

根据经验,当您浏览代码时,您可以通过思考这些问题来发现互斥代码(也就是关键部分):

  1. 我是否有这里可公开访问的数据(数据就是一切:对象实例,标准容器等......)?
  2. 谁可以访问它?
  3. 我可以访问它吗?
  4. 如果所有这些问题的答案都是,您可能需要注意并使用某种同步机制来保护这些数据。

    对于原始类型,最简单的方法可能是原子变量。

    对于更复杂的类型,例如某种容器,你应该使用互斥锁。

    对于更复杂的场景,例如驱动程序,中断等,您应该阅读有关自旋锁和读写锁以及更高级机制的更多信息。

    注意:这是对这个问题的过度简化,但我相信它为那些开始解决这个复杂问题的人描绘了一幅非常好的画面。