问题标签 [waitformultipleobjects]

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 投票
2 回答
15637 浏览

windows - 简单的多线程互斥锁示例不正确

我希望以随机顺序获得从 0 到 4 的数字,但相反,我有一些不同步的混乱

我做错了什么?

0 投票
1 回答
1078 浏览

asynchronous - 在循环中使用 WaitForMultipleObjects 而不是 WaitForSingleObject 有什么好处?

我有一个vector<HANDLE>. 我想等他们全部完成。我不想将它们复制到数组中。无论如何这样做并使用WaitForMultpleObjects,而不是WaitForSingleObject在循环中使用(如果有的话)有什么好处?

谢谢!

0 投票
3 回答
459 浏览

c++ - 多个互斥锁上的 Windows 同步

我不清楚这一点,有人可以帮我确认一下吗?

我有以下同步问题。我有以下对象:

这是访问条件:

  1. A 必须在 B 或 C 打开时被阻止。
  2. 只有在 A 开启时才能阻止 B。
  3. 只有在 A 开启时才能阻止 C。

所以我想为此使用2个命名互斥锁:

  • hMutex2 = 用于满足上述条件 2。
  • hMutex3 = 用于满足上述条件 3。
  • hStopEvent = 一个停止事件(如果应用程序正在关闭,需要停止线程)。

所以对于 A:

对于 B:

对于 C:

有人可以证实这一点:

  • 在两个互斥体上调用 WaitForMultipleObjects 时,它们是否都变为信号(或阻塞)?
  • 我还需要释放两个互斥锁吗?
0 投票
4 回答
2519 浏览

c++ - 在 WaitForMultipleObjects() 中使用 std::vector

我有一个std::vector句柄对象。我必须等待这些句柄对象在WaitForMultipleObjects函数中使用。因为它是一个向量,所以在使用它时出现错误WaitForMultipleObjects

有没有办法做到这一点?

0 投票
2 回答
438 浏览

c++ - WaitForSingleObject 等待超时

我正在使用WaitForMultipleObject带有 waitForAll 参数 = true 的函数。这里使用一个 std::vector句柄对象来等待。如果此函数超时,那么我如何识别等待哪个句柄超时?

0 投票
2 回答
342 浏览

c++ - 如何在 C++ 中使用 waitformultipleobject

我正在尝试编写一个等待客户端连接的代码。一旦它连接到客户端,它应该开始读取文件并发送它。

我需要通知套接字句柄,即如果连接从客户端丢失,它会通知我,以便我可以尝试重新连接。

0 投票
3 回答
1834 浏览

winapi - 当使用 MsgWaitForMultipleObjectsEx 进行检查时,带有 WM_USER 的 PostMessage 似乎没有到达

我有一个带有几个线程循环的程序,您可以将任务发布到其中。这些线程循环之一是 UI 线程循环。它必须处理窗口消息以及发布的任务,所以我发送 WM_USER 消息来唤醒调度循环中的线程。

问题是有时(特别是当有很多其他窗口消息时WM_PAINTWM_RESIZE我的WM_USER消息不会唤醒线程。似乎该PostMessage函数没有从MsgWaitForMultipleObjectsEx调用中唤醒线程,但我不知道为什么。

这就是它的样子(为简单起见,有些解释):

编辑:对上面的直接调用MsgWaitForMultipleObjectsEx是一种简化。我实际上调用了一个看起来像这样的函数:

0 投票
1 回答
3738 浏览

winapi - SerialPorts 和 WaitForMultipleObjects

我在跨平台应用程序(具有 Linux 嵌入式和实际嵌入式目标)中的串行端口存在一些问题,它也适用于 Windows 以使开发更容易。这是关于 Windows 实现的。

因此,串行协议的实现针对的是 OS 和非 OS 系统的混合,我不会触及实现本身。我想让它与现有的实现兼容。如果在合理时间内失败,我将创建一个单独的线程用于串行读取。

好的,基本上这个实现会打开串口,在我们的 IO 系统(epoll在 Linux 和WaitForMultipleObjectsWindows 上使用)中注册文件描述符,然后,基本上,只是等待所有句柄并执行任何需要的操作。因此,当句柄发出读取信号时,我们希望从串行端口读取。不幸的是,在 Windows 上,您无法指定是等待读取还是写入,所以我想我会使用以下解决方案:

  • CreateFileFILE_FLAG_OVERLAPPED
  • SetCommMaskEV_RXCHAR
  • 创建OVERLAPPED具有手动重置事件的结构
  • WaitCommEvent使用所述结构调用OVERLAPPED,通常返回ERROR_IO_PENDING

这就是基本设置。我注册了事件句柄而不是文件句柄来等待。当手柄发出信号时,我执行以下操作:

  • ReadFile
  • 如果成功,再次ResetEvent调用WaitCommEvent

但是,如果您指定FILE_FLAG_OVERLAPPED,您似乎也必须使用重叠 IO 进行读取和写入。所以我想无论何时ReadFileWriteFile返回,我都会用andERROR_IO_PENDING等待 IO 。不过,我似乎并没有参与其中。它似乎基本上可以工作,但有时它会在其中一个调用上崩溃,好像重叠仍然处于活动状态(尽管我猜它仍然不应该崩溃)。WaitForSingleObjectGetOverlappedResultResetEvent

所以,实际的问题。这可以按我的意愿完成吗?总的来说,这种方法是否存在问题,或者它应该有效吗?还是使用另一个线程是唯一好的解决方案?通信已经在一个单独的线程中,所以它至少是三个线程。


我将尝试根据需要发布尽可能多的代码,尽管它与实际代码相比有所减少,其中包含许多与串行读取没有直接关系的内容。

构造函数在单独的线程中调用,该线程稍后调用 Open:

通过一个相当长的链,线程然后调用WaitForMultipleObjectsm_ ,它与结构的成员waitHandle相同。这是在一个循环中完成的,并且列表中还有其他几个句柄,这就是为什么这与您有一个线程专门从串行端口读取的典型解决方案不同的原因。基本上,我无法控制循环,这就是为什么我尝试在正确的时间执行(within )。hEventOVERLAPPEDWaitCommEventInitWait

当句柄发出信号时,线程调用 ReadData 方法:

写入完成如下,不同步:

看来它现在确实有效。再也没有崩溃了,至少我无法重现它们。所以它现在有效,我只是问我所做的是否理智,或者我是否应该以不同的方式做事。

0 投票
1 回答
549 浏览

winapi - 为什么 WaitForMultipleObjectsEx 在 APC 期间获取互斥锁?

我有 5 个线程(在多核系统上)同时等待:

  1. 要获取的互斥锁 M
  2. 要发出信号的事件 E

我正在使用WaitForMultipleObjectsEx(..., TRUE, INFINITE, TRUE),因为线程使用 APC。
请注意,APC不会以任何方式使用/触摸/更改/观察互斥锁或事件。

我正在使用 Visual Studio 和Process Hacker进行调试,我正在目睹一个奇怪的现象:
通常,应该运行的线程(称为线程 A)仍在等待这两个对象。

我说“应该运行”是因为:

  1. 我已经多次验证(包括通过 Process Hacker)E 确实处于信号状态
  2. 没有其他线程获得 M 的所有权。实际上,还有3 个其他线程也在等待获得 M。

然而,根据 Process Hacker(用于NtQueryMutant检索计数)的说法,在这种情况下,M 的“计数”值低得离谱,例如 -618。

当然,我没有忘记调用ReleaseMutex(是的,我也在检查返回值);事实上,一旦有人后来获得了互斥锁,Count 就会重新增加。

所以这引出了一个问题:如果其他 4 个线程中有 3 个正在休眠,那么最后一个线程(B)在做什么?

答案是 B 正在调用中执行 APC 。无论我在 Visual Studio 中“逐步”通过 B 多远(甚至一直备份),其他线程都不会唤醒。 只有APC 完成执行后,才会唤醒任何线程!WaitForMultipleObjectsEx
RtlDispatchAPC

我觉得这很奇怪,WaitForMultipleObjectEx文档说

bWaitAllTRUE时,仅当所有对象的状态都设置为已发出信号时,函数的等待操作才完成。在所有对象的状态都设置为已发出信号之前,该函数不会修改指定对象的状态。例如,可以向互斥体发出信号,但在其他对象的状态也设置为已发出信号之前,线程不会获得所有权。与此同时,其他一些线程可能会获得互斥锁的所有权,从而将其状态设置为非信号。

文档是错误的,还是我的错误?

为什么WaitForMultipleObjectsEx在 APC 执行期间获取互斥锁,即使它知道无论如何它永远不会获取互斥锁(因为执行 APC 意味着它将返回WAIT_IO_COMPLETE,永远不会获取互斥锁)?

0 投票
2 回答
513 浏览

c++ - 仅给定已创建的进程向量,等待多个对象

我有一个来自我使用创建进程运行的进程的句柄向量。我想知道如何将其传递给 WaitForMultipleObjects(v.size, "code goes here",true,infinite);

每次循环并创建进程时,我都会使用 PROCESS_INFORMATION 的句柄字段填充句柄向量。