快速提问:
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#函数。
答案 0 :(得分:0)
如果线程属于同一个进程,则应设置一个关键部分( C#中的lock
关键字)以保护boo.modifyThat()
不被同时调用。
如果您使用互斥或关键部分来防止多个线程同时执行代码,我建议您避免在受保护的代码块中调用方法。
boo.modifyThat()
可能会尝试进入另一个关键部分。根据源代码的编写方式,您可能会发现无意中创建了死锁。当越来越多的开发人员开始使用相同的代码库时,这就成了一个更大的问题。
换句话说,从关键部分调用方法会增加风险,以防将来引入线程问题 。
原帖没有提到正在使用的编程语言。无论如何,同样的规则也适用。
如果您使用C#.NET进行编程,请查看以下内容: