可选的螺纹安全性(仅在条件下的螺纹安全部分)

时间:2015-12-21 11:38:51

标签: c# multithreading locking

如标题所述,我有这种情况

lock ( _myLockObj )
{
    // protected section here ( select + update over SQL Tables)
}

这很好用,但有时我不需要线程安全,因为数据保证不会发生任何错误(即使两个线程在parralel中运行)但我需要速度。 目前,程序可以理解线程何时可能存在线程安全问题,何时不能(当我不需要尽可能快时)。

我将实现的是对该锁定指令的选择性,只有在适当的条件下才会生效。

例如:

lock ( _myLockObj ) && flag

我很确定lock关键字不提供语义,我理解的是实现该行为的正确方法是什么。

2 个答案:

答案 0 :(得分:3)

try/finally语句是bool flag = false; bool acquiredLock = false; try { if (flag) { Monitor.Enter(_myLockObj, ref acquiredLock); } } finally { if (flag & acquiredLock) { Monitor.Exit(_myLockObj); } } 块中Monitor.Enter + Monitor.Exit的语法糖。

您可以直接使用这些方法:

.on

答案 1 :(得分:0)

我个人认为以下更好:

private bool flag;

public T DoStuff() {
  T DoStuffUnsafe() {
    // ...
  }
  if (flag) {
    lock (_myLockObj) {
      return DoStuffUnsafe();
    }
  }
  else {
    return DoStuffUnsafe();
  }
}