交叉布尔值为互斥锁

时间:2015-07-16 11:11:51

标签: concurrency boolean mutex

快速提问:

foo1和foo2使用(读取和修改)来自不同线程的相同共享boo对象,因此它们应该是互斥的。

在这种并发情况下,我不确定是否可以使用交叉布尔值而不是互斥量。

主题1:

void foo1()
{
    if(mutex == true)
    {
        boo.modifyThis();
        mutex = false;
    }
}

主题2:

void foo2()
{
    if(mutex == false)
    {
        boo.modifyThat();
        mutex = true;
    }
}
你怎么看?你看到任何缺陷吗?

谢谢!

编辑:modifyThis和modifyThat只更改boo的内部成员。只有2个线程,它们只调用相应的foo#函数。

1 个答案:

答案 0 :(得分:0)

如果线程属于同一个进程,则应设置一个关键部分( C#中的lock关键字)以保护boo.modifyThat()不被同时调用。

设计问题

如果您使用互斥或​​关键部分来防止多个线程同时执行代码,我建议您避免在受保护的代码块中调用方法

boo.modifyThat()可能会尝试进入另一个关键部分。根据源代码的编写方式,您可能会发现无意中创建了死锁。当越来越多的开发人员开始使用相同的代码库时,这就成了一个更大的问题。

换句话说,从关键部分调用方法会增加风险,以防将来引入线程问题

其他阅读

原帖没有提到正在使用的编程语言。无论如何,同样的规则也适用。

如果您使用C#.NET进行编程,请查看以下内容: