1

.net 中的线程是否可能被长时间阻塞超过 10 秒?还是 .net 或 Windows 在线程之间切换以确保它们被执行?

4

1 回答 1

2

如果线程调用阻塞操作,例如等待事件触发,它可能会被阻塞很长时间:

  evt.WaitOne();

或尝试访问关键部分:

  lock( _myLockObject )
  {
     // ...
  }

在这些情况下,您的线程已经放弃了控制权,并且处理器致力于让其他线程运行。

但也许你在问一个线程是否可以被饿死?在所有正常情况下,答案都是“不”——操作系统确保所有线程都获得处理器的一部分。如果一个非常高优先级的线程在循环中搅动,可能会有一个例外,但即使这样,操作系统也不应该完全饿死其他线程。

如果您看到一个线程在很长的时间间隔(如 10 秒)内没有取得进展,那么可能是其他问题。它可能正在执行隐式阻塞(甚至可能是死锁)的操作,或者它可能在创建后从未真正开始。

于 2012-10-13T02:33:50.643 回答