问题标签 [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.

0 投票
1 回答
5377 浏览

c++ - 有没有在 C++0x 中实现 AutoResetEvent 的简单方法?

我知道我之前问过这个问题:Linux 下 AutoResetEvent 的 C++ 等价物是什么?

但是,我了解到在 C++0x 中,线程库变得更加简单,所以我想再次提出这个问题,是否有一种简单的方法可以在 C++0x 中实现 AutoResetEvent?

0 投票
3 回答
3856 浏览

c# - AutoResetEvent 和多个 Set

我正在尝试围绕堆栈设计一个数据结构,该结构会阻塞直到堆栈有可用的项目。我尝试使用 anAutoResetEvent但我想我误解了同步过程的工作原理。基本上,看下面的代码,当没有可用的东西时,我试图从堆栈中弹出。

似乎它的AutoResetEvent行为就像一个信号量。那是对的吗?我可以摆脱Set()BlockingStack.Get()并完成它吗?或者这会导致我只使用我的堆栈项目之一的情况。

我的假设是当一个函数调用AutoResetEvent通过时所有等待线程的重置。WaitOne()但是,似乎有多个线程进入。除非我在某个地方搞砸了我的逻辑。

编辑:这是给 Silverlight 的。

0 投票
1 回答
344 浏览

.net - 学习实现线程池 - 使用 autoresetevent 时信号事件丢失

我坚信通过重塑来学习。带着这种心态,我着手实现自定义线程池。我为自己设定的目标如下:

  1. 能够在线程池中对工作项进行排队。
  2. 能够处理具有固定数量线程的工作项——所有线程同时创建。
  3. 普通工作线程函数应该只知道如何 deque,而不应该处理其他函数/属性,如 IsEmpty 或 Count。

我成功地实现了上述目标,但想验证我与 stackoverflow 专家一起采用的方法。另外,想了解是否有更好的方法,或者多线程专家将如何解决这个问题。以下段落提到了我面临的挑战以及我是如何解决的。

我创建的线程池在内部维护了一个工作项队列,所有工作线程都从该队列中选择并处理它。每当一个新项目排队时,它都会发出一个事件信号,以便任何空闲线程都可以拾取并执行它。

我从 autoresetevent 开始向队列中任何新工作项的等待线程发出信号,但我遇到了丢失信号事件的问题。当多个项目排队并且没有空闲线程来处理该项目时,就会发生这种情况。未处理的项目总数与由于重叠集合(信号)事件而丢失的信号事件总数相同。

为了解决丢失信号事件的问题,我在 autoresetevent 之上创建了一个包装器,并使用它来代替 autoresetevent。它解决了这个问题。这是相同的代码清单:

现在,我有几个问题:

  1. 我的方法是否充分证明?
  2. 什么同步机制最适合这个问题,为什么?
  3. 多线程专家将如何处理这个问题?

谢谢。

0 投票
4 回答
1642 浏览

c# - C# 使用 AutoResetEvent 等待来自另一个线程的输入

我花了一些时间寻找这个问题的答案,并在其他线程中找到了大量有用的信息。我相信我已经以一种有效的方式编写了代码,但我对结果并不满意。

我设计了一个通过 C# 与之通信的硬件。硬件通过 USB 连接并在与操作系统枚举后运行初始化例程。此时,它只是等待 C# 程序开始发送命令。在我的 C# 代码中,用户必须按下“连接”按钮,该按钮会发送命令和所需的有效负载,让硬件知道它应该继续运行。然后硬件将命令作为 ACK 发回。问题是我的 C# 程序必须等待接收 ACK,但 GUI 完全冻结,直到硬件响应,因为我不知道如何将其分区到另一个可以自由阻塞的线程。如果硬件立即响应,那么它工作正常,但如果它无法连接,那么程序会无限期地保持冻结状态。

话虽如此,我知道需要发生一些事情,但我不确定如何实现它们。首先,我不认为坐在循环中等待布尔值是正确的方法,但使用 AutoResetEvent 似乎并没有好得多。必须有更好的方法涉及计时器、更多线程或类似的东西。

我将 DataReceived 事件与 serialPort 对象一起使用,如下所示:

在 buttonClick 函数(“主”线程)中,程序在等待 ACK 时停止:

理想情况下,我想知道超时是否过期,以便打印“失败!” 而不是“成功!”。正如我上面提到的,没有超时也意味着它将永远坐在那里,直到我终止进程。它可能找不到任何硬件,但如果找到了,它应该会在 < 1 秒内响应,因此 2 秒的超时就足够了。我尝试使用 Thread.Sleep,但这也冻结了 GUI。

0 投票
3 回答
6071 浏览

c# - AutoResetEvent 和 Mutex 有什么区别

我对这些概念很陌生。但随着我越来越深入,threading我越来越困惑。

有什么意义mutexsemaphoreover autoresetevent

我通过研究了解到的唯一区别是mutex可以跨流程操作执行。如果是这种情况,为什么它没有与Set, Reset,相同的方法WaitOne

我们可以用AutoResetEventwith代替,mutex反之亦然吗?

请解决这个难题。

0 投票
1 回答
5502 浏览

c# - AutoResetEvent 设置超时后调用

来自 MSDN “如果没有等待线程,则等待句柄保持信号状态,直到线程尝试等待它,或者直到它的Reset方法被调用。”

线程#1:

线程#2:

在我的应用程序中,线程 #1 正在向外部应用程序提交请求并等待信号或超时。如果收到来自外部应用程序线程#2 的响应,则设置等待句柄。即使set在超时之后也可以调用它。我的问题是

1)极有可能Method2在超时后调用导致设置信号。这是否意味着以后只要有对 Thread #1 的请求,它就WaitOne(10000)没有任何作用,会立即释放?

2) 无论如何我不能setMethod2超时的情况下打电话吗?这会对 Thread #1 造成任何问题吗?

0 投票
1 回答
3049 浏览

c# - AutoResetEvent 在信号之前触发

我有两种与下面类似的方法。在MainThreadDoWork方法中,无论方法中的 autoResetEvent.Set() 是什么,循环都会完成执行OtherThreadWork。知道这个 AutoResetEvent 实例中发生了什么吗?

编辑

下面是实际的 OtherThreadWork 的样子。

0 投票
1 回答
2728 浏览

.net - 在不影响事件的情况下检查 AutoResetEvent 的值

我正在.NET(C#)的多线程服务器中创建一些“仪器”。

检查 .NET 的值相当容易,ManualResetEvent无需担心更改值:

返回一个布尔值而不等待事件。

但是,我似乎无法从AutoResetEvent;获取相同的信息。如果您调用anAutoResetEvent.WaitOne( 0 )一个set事件,它将在返回时重置该事件(根据定义)。

此时我可以确定的最佳选择是在实际测试事件时将其更改AutoResetEvent为 aManualResetEvent并手动重置:

有没有更好的方法来检查 a 的状态AutoResetEvent?如果可能的话,我更喜欢它的内在原子性AutoResetEvent

0 投票
2 回答
2993 浏览

c# - AutoResetEvent - 两个 set 调用快速并不能保证线程释放 - 为什么?

我正在阅读 MSDN 上的 AutoResetEvent 文档,并且以下警告让我很困扰..

“重要:不能保证每次调用Set方法都会释放一个线程。如果两个调用靠得太近,以至于第二个调用发生在一个线程被释放之前,那么只有一个线程被释放。就好像“

但是这个警告基本上扼杀了拥有这种线程同步技术的理由。例如,我有一个可以容纳工作的列表。而且只有一个生产者会将工作添加到列表中。我有消费者(不止一个),等待从列表中获得工作.. 像这样..

制片人:

消费者

如果上述警告属实,那么如果我很快将两个作业排入队列,那么只有一个线程会接手该作业,不是吗?我假设 Set 将是原子的,即它执行以下操作:

  1. 设置事件
  2. 如果线程正在等待,则选择一个线程唤醒
  3. 重置事件
  4. 运行选定的线程。

所以我基本上对 MSDN 中的警告感到困惑。这是一个有效的警告吗?

0 投票
2 回答
205 浏览

c# - 递增autoresetevent c#

c# 库中是否有递增的 AutoResetEvent 或类似的东西?

一个人将如何着手有效地实现一个,或者在不这样做的情况下解决所陈述的问题?

问题:为了澄清我的需求,我有一个生产者/消费者情况,其中生产者数量未知,消费者数量固定。

编辑:忘了提到一个问题,我不能使用 .NET 4.0,所以我不能使用ConcurrentQueue<T>:'(,我现在需要坚持使用 .NET 2.0。