jjzjj

PulseAll

全部标签

C# 线程 : Using Monitor. 等待、锁定和 PulseAll

我是CSharp和线程的新手。为了熟悉Monitor.Wait、Monitor.lock和Monitor.PulseAll,我构建了一个场景描述如下。“一个FootballGround由不同的球队共享用于练习目的。任何时候只有一个球队可以使用field进行练习。一个团队可以使用field进行30分钟的练习。一旦时间达到25分钟,它应该向其他球队发出信号地面将在5分钟后释放的线程。本地面潮湿时(枚举有三个值free、alloted、wet)不允许任何团队锁定地面,所有人都应等待10分钟”老实说,我不知道如何将描述转化为实际编码。根据我的理解,我设计了大纲。namespaceThreadi

C# : Monitor - Wait, 脉冲,PulseAll

我很难理解Wait()、Pulse()、PulseAll()。他们都能避免僵局吗?如果您解释一下如何使用它们,我将不胜感激? 最佳答案 简短版:lock(obj){...}是Monitor.Enter/Monitor.Exit的缩写(带有异常处理等)。如果没有其他人拥有锁,您可以获取它(并运行您的代码)——否则您的线程将被阻塞,直到获得锁(由另一个释放它的线程)。死锁通常发生在A:两个线程以不同的顺序锁定事物:thread1:lock(objA){lock(objB){...}}thread2:lock(objB){lock(obj

c# - 为什么 Monitor.PulseAll 在信号线程中导致 "stepping stair"延迟模式?

在使用Monitor.PulseAll()进行线程同步的库中,我注意到从调用PulseAll(...)到线程被唤醒的延迟似乎遵循“阶梯”分布--步幅极大。被唤醒的线程几乎没有做任何工作;并几乎立即返回等待监视器。例如,在一个有12个内核和24个线程等待监视器的盒子上(2xXeon5680/Gulftown;每个处理器6个物理内核;禁用HT),脉冲和线程唤醒之间的延迟是这样的:前12个线程(注意我们有12个内核)需要30到60微秒来响应。然后我们开始有很大的跳跃;稳定期在700、1300、1900和2600微秒左右。我能够使用下面的代码独立于第3方库成功地重新创建此行为。这段代码所做的是