当前位置:  开发笔记 > 编程语言 > 正文

如何在C#中编写条件锁?

如何解决《如何在C#中编写条件锁?》经验,为你挑选了5个好方法。

问题是我一直在使用lock语句来保护我的代码的关键部分,但是现在,我意识到我可以允许并发执行那些关键代码是满足某些条件的.
有没有办法调节锁?



1> Tomalak..:

我认为那个问题叫"竞争条件!".如果在检查后不久条件从true变为false,但在线程进入代码的关键部分之前怎么办?或者一个线程正在执行它?



2> 小智..:

我不是线程专家,但听起来你可能正在寻找这样的东西(双重检查锁定).想法是在获得锁之前和之后检查条件.

private static object lockHolder = new object();

if (ActionIsValid()) {
  lock(lockHolder) {
    if (ActionIsValid()) {
       DoSomething();    
    }
  }
}



3> marijne..:
bool locked = false;
if (condition) {
    Monitor.Enter(lockObject);
    locked = true;
}
try {
    // possibly critical section
}
finally {
    if (locked) Monitor.Exit(lockObject);
}

编辑:是的,有一个竞争条件,除非您可以确保在线程进入时条件是恒定的.



4> Amy B..:
Action doThatThing = someMethod;

if (condition)
{
  lock(thatThing)
  {
     doThatThing();
  }
}
else
{
  doThatThing();
}



5> Marc Gravell..:

实际上,为了避免出现竞争状况,我很想在ReaderWriterLockSlim这里使用-将并发访问视为读锁定,而将独占访问视为写锁定。这样,如果条件发生变化,您将不会最终在该区域盲目执行某些不适当的代码(错误地认为它是安全的);有点冗长,但是(格式化为空格):

        if (someCondition) {
            lockObj.EnterReadLock();
            try { Foo(); }
            finally { lockObj.ExitReadLock(); }
        } else {
            lockObj.EnterWriteLock();
            try { Foo(); }
            finally { lockObj.ExitWriteLock(); }
        }

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有