1

ロックメカニズムに関する多くの資料を読みましたが、次のようなものの書き方についてはまだ答えがありません。

  • 出口よりも多くの入口を受け入れる
  • 2 番目のスレッドは最大 5 秒間待機し、その後クリティカル セクションに入ります。

以下の作品。ThreadA_Method1が複数回呼び出され、その後 (時々) ThreadA_Method2が続くケースを処理します。しかし、より良い解決策はありますか?

Private _lock as Boolean

Private Sub ThreadA_Method1 Handles _otherDll.BeforeAction
  _lock = True
  ' A - Critical section code 1
  ' ...
End Sub

Private Sub ThreadA_Method2  Handles _otherDll.AfterAction
  Try
    ' A - Critical section code 2 
    ' ...
  Finally
    _lock = False
  End Try
End Sub

Private Sub ThreadB_Method
  Dim stopWatch As Stopwatch = New Stopwatch()
  stopWatch.Start()
  While _lock AndAlso stopWatch.ElapsedMilliseconds < 5000
    Thread.Sleep(100)
  End While
  stopWatch.Stop()

  ' B - Critical section code
  ' ...
End Sub
4

1 に答える 1

0

forSystem.Threading.ManualResetEventの代わりに使用することをお勧めします ( http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent(v=vs.80).aspxを参照)。次に、メソッドを使用してより効率的に一時停止できます。Boolean_lockWaitOne

Private _lock As New ManualResetEvent(False)

Private Sub ThreadA_Method1() Handles _otherDll.BeforeAction

  _lock.Reset()
  ' A - Critical section code 1 
  ' ... 
End Sub

Private Sub ThreadA_Method2() Handles _otherDll.AfterAction
  Try
    ' A - Critical section code 2  
    ' ... 
  Finally
    _lock.Set()
  End Try
End Sub

Private Sub ThreadB_Method()

  _lock.WaitOne(5000)

  ' B - Critical section code 
  ' ... 
End Sub
于 2012-08-08T21:03:19.383 に答える