【发布时间】:2013-09-28 03:03:01
【问题描述】:
我在多个线程之间共享一个资源,使用模式如下:
线程 1 不断使用受保护的资源。
线程 2..N 需要在很短的时间内不频繁地与受保护资源进行交互。
我希望线程 1 在其工作周期的特定时间持续持有保护资源的锁,让其他线程等待轮到它们。如果没有其他线程碰巧在等待,它应该立即重新获得锁并继续它的工作。
我想一种方法是这样的:
lock (resource)
{
while (!stop)
{
resource.DoWorkIteration();
// give other threads a chance
Monitor.Exit(resource);
Thread.Sleep(0);
Monitor.Enter(resource);
}
}
但是,Sleep(0) 将让步给任何准备运行的线程,而不仅仅是等待这个特定资源的线程。
有没有更好的方法来避免不必要的让步?
【问题讨论】:
-
如果在
Exit()和Enter()之间抛出异常并且lock块尝试释放未拥有的资源会发生什么?
标签: .net multithreading synchronization locking