2013-11-01 42 views
0

F#中有否可以检测到当前正在等待的线程是否等待太久而未被联系?等待时间过长的干涉线程

我有一种情况,线程必须积极联系其他等待线程,以便在完成工作后将其工作传递给它们。我的解决方案有一个错误,有时候一个或多个线程会等待太久,最终程序会死锁,因为其他线程不会联系它们。

我想通过检测一个等待线程是否仅仅等待太久,它会主动寻找可用的工作,而不是等待其他线程传递给它。

+2

取决于您如何等待,但通常情况下,等待功能有某种您可以设置的超时时间。请参阅:http://msdn.microsoft.com/en-us/library/cc189907(v=vs.110).aspx –

回答

1

这可能会更好地尝试和理解为什么你的线程卡住,而不是终止它们。如果您可以通过附加的Visual Studio调试器重现此问题,则可以单击“暂停”按钮并使用“线程”窗口查看所有线程都在使用哪个代码。

这就是说;如果你仍然需要这样做,解决方案将取决于你如何管理你的线程。为了从外部监控它们,您需要一些具有线程列表并能够判断它们是否死机的进程。

Thread类似乎没有任何内置的机制来共享线程与其控制之间的状态,除了Name。你可能会滥用名字,但我可能有一个线程安全的集合(例如,一个ConcurrentDictionary<Thread, DateTime>)来存储所有的线程和他们上次通信的时间戳,并且在每个线程启动时将Action传递给它们,以允许它“Ping”通过定期调用该操作。该操作只会更新针对该线程存储的DateTime

控制过程然后只是定期扫描字典中的任何时间戳太旧的任何东西,声明线程死了,并且Aborts()它。

很难给出一个代码示例,而不知道如何产生线程,并更详细地描述“正在联系”线程的含义。