- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 ASP.NET 中有一个生产者-消费者场景。我设计了一个Producer
类,一个Consumer
类和一个用于保存共享对象并负责Producer 和Consumer 之间通信的类,我们称它为Mediator
。因为我在启动时 fork 执行路径(在父对象中)并且一个线程会调用 Producer.Start()
而另一个线程会调用 Consumer.Start()
,我需要将 Mediator
的引用传递给 Producer
和 Consumer
(通过 Constructor
)。 Mediator
是一个智能类,它将优化许多事情,例如它的内部队列的长度,但现在将其视为循环阻塞队列。 Producer
会将新对象排队到Mediator
,直到队列满为止,然后Producer
会阻塞。 Consumer
dequeues 来自 Mediator
的对象,直到队列中没有任何对象。对于线程之间的信号,我在 Mediator
类中实现了两个方法:Wait()
和 Pulse()
。代码是这样的:
Class Mediator
{
private object _locker = new object();
public void Wait()
{
lock(_locker)
Monitor.Wait(_locker);
}
public void Pulse()
{
lock(_locker)
Monitor.Pulse(_locker);
}
}
// This way threads are signaling:
Class Consumer
{
object x;
if (Mediator.TryDequeue(out x))
// Do something
else
Mediator.Wait();
}
在 Mediator 内部,每次入队或出队时,我都会使用this.Pulse()
,这样等待的线程就会收到信号并继续它们的工作.
但我遇到了死锁,因为我从未使用过这种设计来发送信号线程,所以我不确定是设计有问题还是我在其他地方做错了什么?
谢谢
最佳答案
这里没有太多代码可以继续,但我最好的猜测是你有一个 live-lock问题。如果 Mediator.Pulse
在 Mediator.Wait
之前调用,那么即使队列中有内容,信号也会丢失。这是实现阻塞队列的标准模式。
public class BlockingQueue<T>
{
private Queue<T> m_Queue = new Queue<T>();
public void Enqueue(T item)
{
lock (m_Queue)
{
m_Queue.Enqueue(item);
Monitor.Pulse(m_Queue);
}
}
public T Dequeue()
{
lock (m_Queue)
{
while (m_Queue.Count == 0)
{
Monitor.Wait(m_Queue);
}
return m_Queue.Dequeue();
}
}
}
请注意 Monitor.Wait
是如何仅在队列为空时调用的。还要注意它是如何在 while
循环中被调用的。这是因为 Wait
没有 Enter
的优先级,因此进入 Dequeue
的新线程可能会占用最后一项,即使调用Wait
准备返回。如果没有循环,线程可能会尝试从空队列中删除一个项目。
关于c# - Monitor.Wait() 和 Monitor.Pulse() 的线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3956127/
我正在尝试通过连接到我的 linkedin 应用程序将我的博客集成到 Linkedin Pulse。我发现发布到 API /v1/people/~/shares 会分享我的更新,但我不知道如何在 Pu
我正在尝试在我的 GUI 系统中的两个线程之间进行同步。 系统主要任务是初始化两个同步对象并运行两个线程: private FetcherAPI fetcherAPI { get; set; } pr
我有这个生产者/消费者代码: 主要内容: static void Main() { using(PCQueue q = new PCQueue(2)) { for(in
我有一个类,它应该是线程安全的。我最好想用一个同步对象来管理线程安全,以避免复杂的思维破坏,因为所有方法都会改变对象状态变量。因此,我在该对象上用 lock 语句包装方法体。在某些情况下,需要释放锁一
如何制作一个可滚动的Pulse-like导航栏(区域由矩形标记)?有人可以给我举个例子吗? 谢谢吕赖尼 最佳答案 其实很简单。只是嵌套 ScrollView 。外面的覆盖整个屏幕,只允许垂直滚动。 每
如何使 div/input 闪烁或“脉冲”?例如,假设表单字段输入了无效值? 最佳答案 使用 CSS3 类似 on this page ,您可以将脉冲效果添加到名为 error 的类中: @-webk
我遇到了一个问题,我将其简化为这个最小的测试用例,但我仍然不明白为什么它不能正常工作。这里的代码很简单:父线程获取一个锁,然后启动一个子线程,接下来通过启动 await 来释放锁。然后被锁定在同一个锁
我只是想确保我了解这里的内容。如果我使用 Monitor.Enter 或 lock 获得锁定,我是否需要在释放锁定之前调用 Pulse? Monitor.Enter Monitor.Pulse //
他们似乎都实现了相同的目的。我什么时候可以选择一个? 最佳答案 当您的线程正在等待多个事件之一或全部在做某事时,请使用事件。 如果要通过限制可以访问多少线程来限制对数据结构的访问,请使用监视器。 监视
我下载了Sound.Pulse.Simple并复制并粘贴示例程序: main=do s Fractional (GHC.Real.Ratio a) -- Defined in `GHC.R
我想重现active noise-control的效果使用普通耳机和 Linux 计算机的耳机,以便实时静音任何环境噪音(不仅仅是从背景噪音中清除声音输入)。 计划是通过 Alsa/Pulseaudi
我对网络开发知之甚少。 我正在尝试将代码添加到 linkedin 帖子,我尝试了 github Gist 但它不起作用。 有办法还是根本不可能? 最佳答案 似乎仍然(截至 2017 年 11 月 27
我创建了一个脉冲动画,它在 map 上占据一个位置,并持续发出一个脉冲(圆圈)。这按预期工作。但是,我希望脉冲淡出,离点越远。关于如何实现最佳效果有什么想法吗? 动画如下: mCircle =
我想知道如何像应用程序Pulse一样通过表格显示图像。在 iPhone 上。我使用了 UIScrollView 但它并没有太大帮助。它仅以类似数组的方式显示图像,但您无法产生事件或单击图像。 生成 P
我正在尝试优化与 Monitor.Wait 和 Monitor.Pulse 方法类似(基本功能)的异步版本。我们的想法是通过异步方法使用它。 要求:1) 我有一个任务正在运行,它负责等待有人给我的显示
http://www.codeproject.com/Articles/28785/Thread-synchronization-Wait-and-Pulse-demystified Queues:
根据 MSDN , Monitor.Wait(): Releases the lock on an object and blocks the current thread until it reac
我正在尝试编写一个基本的卷应用程序。由于我是用 Ruby 编写的,因此我不想扩展 C 库或使用 ffi ,而是尝试使用 ruby-dbus 编写它,我使用 Address 获得了 /org/pulse
有没有人在基于 Ubuntu 的 Linux 发行版上成功使用 Juniper Junos 脉冲客户端。 我想知道是否有任何可靠的基于浏览器的 VPN 客户端可以用作替代方案 谢谢 最佳答案 Alex
Delphi Docwiki 解释说 Pulse通知等待队列中的下一个线程,一旦调用线程释放该对象,它将能够锁定指定的对象。 PulseAll向等待队列中的所有线程发出信号。 我found这段代码在线
我是一名优秀的程序员,十分优秀!