【问题标题】:Mutually Exclusive code互斥代码
【发布时间】:2017-10-22 19:24:53
【问题描述】:

我如何判断代码在关键部分是互斥的?我理解这个概念,但是在代码跟踪方面,我很难识别互斥代码。这是有问题的代码段......

// 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 
}

这太糟糕了,所以任何关于互斥的一般见解都会受到赞赏。

【问题讨论】:

    标签: multithreading thread-safety mutual-exclusion


    【解决方案1】:

    我很难识别互斥代码

    根据经验,当您浏览代码时,您可以通过思考以下问题来发现互斥代码(也称为临界区):

    1. 我是否获得了可公开访问的数据(数据就是一切:对象实例、标准容器等...)?
    2. 谁可以访问它?
    3. 他们可以在我访问它的同时访问它吗?

    如果所有这些问题的答案都是,那么您可能必须使用某种同步机制来小心和保护这些数据。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多