【问题标题】:Sort of SyncLock同步锁的排序
【发布时间】:2012-08-28 19:21:31
【问题描述】:

我正在检查这段代码,它在执行类似于 SyncLock 的操作,但它们不会等待其他线程,而是跳过代码。

代码是用变量做的;我想知道是否有一个内置的 .net 函数可以做到这一点?

Private _previousValueCount As Integer = 0

Private Sub F()
   If _previousValueCount = 0 Then
       _previousValueCount = 1
       ' ...
       _previousValueCount = 0
   End If
End Sub

【问题讨论】:

  • 顺便说一句,该代码不是线程安全的;这基本上与我发布的Interlocked 版本相同,但区别在于Interlocked 线程安全的

标签: .net vb.net multithreading


【解决方案1】:

有很多方法可以做到;一种方法是执行以下操作:

int lockTaken = 0;

...

bool haveLock = false;
try {
    haveLock = Interlocked.CompareExchange(ref lockTaken, 1, 0) == 0;
    if(haveLock) {
       // it was zero, it is now one; you won the lock: do something
    }
} finally {
    if(haveLock) Interlocked.Exchange(ref lockTaken, 0);
}

另一种方法是使用具有零超时的Monitor.TryEnter

readonly object syncLock = new object();
...
bool haveLock = false;
try {
    Monitor.TryEnter(syncLock, 0, ref haveLock);
    if(haveLock) {
      // you won it; do something
    }
} finally {
    if(haveLock) Monitor.Exit(syncLock);
}

【讨论】:

    【解决方案2】:

    您可以使用 Monitor 类尝试获取任何类型的全局对象上的锁定。如果你没有在一定的时间跨度/毫秒内获得,你可以随心所欲。

    bool acquiredLock = false;
    try
    {
      Monitor.TryEnter(lockObject, 1000, ref acquiredLock);
      if (acquiredLock)
      {
        // got lock, do something
      }
      else
      {
        // no lock - warning/error/...
      }
    }
    finally
    {
      if (acquiredLock)
         Monitor.Exit(lockObject);  // release lock!
    }
    

    【讨论】:

      猜你喜欢
      • 2012-02-24
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      • 2019-03-19
      • 2011-05-11
      相关资源
      最近更新 更多