问题标签 [autoresetevent]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 有没有在 C++0x 中实现 AutoResetEvent 的简单方法?
我知道我之前问过这个问题:Linux 下 AutoResetEvent 的 C++ 等价物是什么?
但是,我了解到在 C++0x 中,线程库变得更加简单,所以我想再次提出这个问题,是否有一种简单的方法可以在 C++0x 中实现 AutoResetEvent?
c# - AutoResetEvent 和多个 Set
我正在尝试围绕堆栈设计一个数据结构,该结构会阻塞直到堆栈有可用的项目。我尝试使用 anAutoResetEvent
但我想我误解了同步过程的工作原理。基本上,看下面的代码,当没有可用的东西时,我试图从堆栈中弹出。
似乎它的AutoResetEvent
行为就像一个信号量。那是对的吗?我可以摆脱Set()
它BlockingStack.Get()
并完成它吗?或者这会导致我只使用我的堆栈项目之一的情况。
我的假设是当一个函数调用AutoResetEvent
通过时所有等待线程的重置。WaitOne()
但是,似乎有多个线程进入。除非我在某个地方搞砸了我的逻辑。
编辑:这是给 Silverlight 的。
.net - 学习实现线程池 - 使用 autoresetevent 时信号事件丢失
我坚信通过重塑来学习。带着这种心态,我着手实现自定义线程池。我为自己设定的目标如下:
- 能够在线程池中对工作项进行排队。
- 能够处理具有固定数量线程的工作项——所有线程同时创建。
- 普通工作线程函数应该只知道如何 deque,而不应该处理其他函数/属性,如 IsEmpty 或 Count。
我成功地实现了上述目标,但想验证我与 stackoverflow 专家一起采用的方法。另外,想了解是否有更好的方法,或者多线程专家将如何解决这个问题。以下段落提到了我面临的挑战以及我是如何解决的。
我创建的线程池在内部维护了一个工作项队列,所有工作线程都从该队列中选择并处理它。每当一个新项目排队时,它都会发出一个事件信号,以便任何空闲线程都可以拾取并执行它。
我从 autoresetevent 开始向队列中任何新工作项的等待线程发出信号,但我遇到了丢失信号事件的问题。当多个项目排队并且没有空闲线程来处理该项目时,就会发生这种情况。未处理的项目总数与由于重叠集合(信号)事件而丢失的信号事件总数相同。
为了解决丢失信号事件的问题,我在 autoresetevent 之上创建了一个包装器,并使用它来代替 autoresetevent。它解决了这个问题。这是相同的代码清单:
现在,我有几个问题:
- 我的方法是否充分证明?
- 什么同步机制最适合这个问题,为什么?
- 多线程专家将如何处理这个问题?
谢谢。
c# - C# 使用 AutoResetEvent 等待来自另一个线程的输入
我花了一些时间寻找这个问题的答案,并在其他线程中找到了大量有用的信息。我相信我已经以一种有效的方式编写了代码,但我对结果并不满意。
我设计了一个通过 C# 与之通信的硬件。硬件通过 USB 连接并在与操作系统枚举后运行初始化例程。此时,它只是等待 C# 程序开始发送命令。在我的 C# 代码中,用户必须按下“连接”按钮,该按钮会发送命令和所需的有效负载,让硬件知道它应该继续运行。然后硬件将命令作为 ACK 发回。问题是我的 C# 程序必须等待接收 ACK,但 GUI 完全冻结,直到硬件响应,因为我不知道如何将其分区到另一个可以自由阻塞的线程。如果硬件立即响应,那么它工作正常,但如果它无法连接,那么程序会无限期地保持冻结状态。
话虽如此,我知道需要发生一些事情,但我不确定如何实现它们。首先,我不认为坐在循环中等待布尔值是正确的方法,但使用 AutoResetEvent 似乎并没有好得多。必须有更好的方法涉及计时器、更多线程或类似的东西。
我将 DataReceived 事件与 serialPort 对象一起使用,如下所示:
在 buttonClick 函数(“主”线程)中,程序在等待 ACK 时停止:
理想情况下,我想知道超时是否过期,以便打印“失败!” 而不是“成功!”。正如我上面提到的,没有超时也意味着它将永远坐在那里,直到我终止进程。它可能找不到任何硬件,但如果找到了,它应该会在 < 1 秒内响应,因此 2 秒的超时就足够了。我尝试使用 Thread.Sleep,但这也冻结了 GUI。
c# - AutoResetEvent 和 Mutex 有什么区别
我对这些概念很陌生。但随着我越来越深入,threading
我越来越困惑。
有什么意义mutex
,semaphore
over autoresetevent
。
我通过研究了解到的唯一区别是mutex
可以跨流程操作执行。如果是这种情况,为什么它没有与Set
, Reset
,相同的方法WaitOne
。
我们可以用AutoResetEvent
with代替,mutex
反之亦然吗?
请解决这个难题。
c# - AutoResetEvent 设置超时后调用
来自 MSDN “如果没有等待线程,则等待句柄保持信号状态,直到线程尝试等待它,或者直到它的Reset
方法被调用。”
线程#1:
线程#2:
在我的应用程序中,线程 #1 正在向外部应用程序提交请求并等待信号或超时。如果收到来自外部应用程序线程#2 的响应,则设置等待句柄。即使set
在超时之后也可以调用它。我的问题是
1)极有可能Method2
在超时后调用导致设置信号。这是否意味着以后只要有对 Thread #1 的请求,它就WaitOne(10000)
没有任何作用,会立即释放?
2) 无论如何我不能set
在Method2
超时的情况下打电话吗?这会对 Thread #1 造成任何问题吗?
c# - AutoResetEvent 在信号之前触发
我有两种与下面类似的方法。在MainThreadDoWork
方法中,无论方法中的 autoResetEvent.Set() 是什么,循环都会完成执行OtherThreadWork
。知道这个 AutoResetEvent 实例中发生了什么吗?
编辑
下面是实际的 OtherThreadWork 的样子。
.net - 在不影响事件的情况下检查 AutoResetEvent 的值
我正在.NET(C#)的多线程服务器中创建一些“仪器”。
检查 .NET 的值相当容易,ManualResetEvent
无需担心更改值:
返回一个布尔值而不等待事件。
但是,我似乎无法从AutoResetEvent
;获取相同的信息。如果您调用anAutoResetEvent.WaitOne( 0 )
一个set
事件,它将在返回时重置该事件(根据定义)。
此时我可以确定的最佳选择是在实际测试事件时将其更改AutoResetEvent
为 aManualResetEvent
并手动重置:
有没有更好的方法来检查 a 的状态AutoResetEvent
?如果可能的话,我更喜欢它的内在原子性AutoResetEvent
。
c# - AutoResetEvent - 两个 set 调用快速并不能保证线程释放 - 为什么?
我正在阅读 MSDN 上的 AutoResetEvent 文档,并且以下警告让我很困扰..
“重要:不能保证每次调用Set方法都会释放一个线程。如果两个调用靠得太近,以至于第二个调用发生在一个线程被释放之前,那么只有一个线程被释放。就好像“
但是这个警告基本上扼杀了拥有这种线程同步技术的理由。例如,我有一个可以容纳工作的列表。而且只有一个生产者会将工作添加到列表中。我有消费者(不止一个),等待从列表中获得工作.. 像这样..
制片人:
消费者
如果上述警告属实,那么如果我很快将两个作业排入队列,那么只有一个线程会接手该作业,不是吗?我假设 Set 将是原子的,即它执行以下操作:
- 设置事件
- 如果线程正在等待,则选择一个线程唤醒
- 重置事件
- 运行选定的线程。
所以我基本上对 MSDN 中的警告感到困惑。这是一个有效的警告吗?
c# - 递增autoresetevent c#
c# 库中是否有递增的 AutoResetEvent 或类似的东西?
一个人将如何着手有效地实现一个,或者在不这样做的情况下解决所陈述的问题?
问题:为了澄清我的需求,我有一个生产者/消费者情况,其中生产者数量未知,消费者数量固定。
编辑:忘了提到一个问题,我不能使用 .NET 4.0,所以我不能使用ConcurrentQueue<T>
:'(,我现在需要坚持使用 .NET 2.0。