我有几个线程之间共享的资源和以下使用模式:
线程 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) 将让步给任何准备运行的线程,而不仅仅是等待这个特定资源的线程。
有没有更好的方法来避免不必要的屈服?