如何解锁锁括号内的线程
How to unlock a thread within lock brackets
我正在尝试将这段c++代码转换为c#:
do{
if (Node->NextNode == NULL) WaitForSingleObject(pThis->_Event, INFINITE);
_critSect.Lock();
if (Node->NextNode == NULL && !bRunning )
{
_critSect.Unlock(); // can explicitly unlock here
break;
}
_critSect.Unlock();
}while (Node->NextNode == NULL);
在c++中,我可以显式地解锁线程,但c#只有一个括号。我如何在打破之前在下面的代码中添加"解锁"功能?
do{
if (Node->NextNode == null) DataQueueEvent.WaitOne();
lock (thisLock)
{
if (Node->NextNode == null && !bRunning)
// need to unlock here!!!
break;
}
} while (Node->NextNode == null);
完全没有必要。在c#中,lock
语句转换为try
/finally
,因此无论您如何退出块,锁都会在退出块时被释放,因此当您使用break
路径退出时无需显式释放锁。
除了servy所说的,如果你想了解它是如何在幕后完成的,请查看这个链接
一旦编译为 ,锁语句将被转换为 。bool acquiredLock = false;
try
{
Monitor.Enter(lockObject, ref acquiredLock);
// Code that accesses resources that are protected by the lock.
}
finally
{
if (acquiredLock)
{
Monitor.Exit(lockObject);
}
}
相关文章:
- 用C++中的std::condition_variable将线程置于死锁中会有风险吗
- condition_variable、引用和线程:谁拥有锁?
- localtime() 函数正在调用 ___lll_lock_wait_private(),这会使线程陷入死锁
- 线程和互斥锁的使用有什么问题
- C++ 多线程中的锁和条件变量问题
- 线程锁定互斥锁的速度比 std::conditional_variable::wait() 快
- STD :: Mutex如何在不同的线程中解锁
- C++ 多线程和互斥锁
- 在发出等待条件变量的信号后,线程何时获取锁?是什么决定了它
- 通过队列对多个线程的互斥锁
- FFMPEG:多线程解码死锁
- c++ boost线程和互斥锁
- c++11线程的RW锁
- 当线程等待互斥锁时捕获的信号
- c++ Boost线程睡眠死锁
- 从线程原因解引用返回的指针;分段故障:11
- 使线程循环5次迭代;线程、互斥锁和信号
- 具有多个线程和互斥锁的竞争条件
- P线程在互斥锁的中间死亡
- 两个线程从无锁堆栈中删除