问题标签 [io-completion-ports]

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 回答
203 浏览

c++ - IOCP:如果操作立即返回错误,我还能收到完成通知吗?

如果启用 FILE_SKIP_COMPLETION_PORT_ON_SUCCESS,那么即使操作立即成功完成,我仍然会在完成端口上收到完成通知。如果它也立即完成并出现错误,我想知道是否是这种情况。

我使用在扩展的 OVERLAPPED 结构中存储为 std::function 的处理程序处理完成,并由在完成端口上循环的线程池执行。禁用 FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 意味着我不必担心处理程序会形成递归链,最坏的情况是,如果操作经常立即完成,则会耗尽堆栈空间。启用跳过后,如果操作立即返回,则必须立即调用新操作的处理程序。

问题是处理程序应该在成功和错误时都执行。但是,我不知道是否重叠的 Read/Write/WSARecv/WSASend 立即返回并出现错误仍会将完成数据包排队,以便我可以允许线程池在处理程序中对其进行处理,如成功案例。这是可行的吗?它是否只适用于某些类型的错误而不适用于其他类型的错误?解决方法?

0 投票
1 回答
58 浏览

ios - iOS/objective-c(++) 相当于 Windows I/O 完成端口?

假设我想实现一个异步加载文件并以文件内容作为结果返回某个任务的方法。在 .NET 中,我可以说:

在幕后,CopyToAsync将利用 IO 完成端口来确保一个线程不会被浪费在空闲、等待 IO 上。

Objective-C(++)中是否有等价物?我可以有效地执行以下合同吗?

0 投票
1 回答
1187 浏览

c# - 在 IOCompletionCallback 中获取 AccessViolationException

我在应用程序启动时收到以下异常:

这就是整个调用堆栈。它只会在应用程序启动时发生二十分之一的运行。我确实在我的套接字代码中使用了 IOCompletion。我认为它与此有关。但是,为什么我打电话时不会显示此异常Socket.ReceiveFromAsync?我有很多同时调用的套接字ReceiveFromAsync,但我不会在同一个套接字上同时调用它两次。关于原因的任何想法?

0 投票
1 回答
342 浏览

c++ - 用于小型单线程应用程序的 I/O 完成端口?

让我先说一下我从未使用过 I/O 完成端口,尽管我已经听说过它们很多年了。我的背景主要是select, poll, epoll,WSAEventSelectWaitForMulitpleObjects. 如果我对以下文本中的 I/O 完成端口有根本的误解,请纠正我。

作为工作项目的一部分,我的任务是为模拟开发一个插件 (DLL),它允许客户端连接到插件并通过 TCP 向/从模拟发送/接收数据。该插件充当服务器。该仿真模拟了不同(不是以太网)接口的通信通道,在这个特定的应用程序中,每个通道都有一个套接字是有意义的。我不知道会有多少个客户端,或者每个客户端会打开多少个通道(套接字)。但是,我知道完全有可能超过 64 个,而且不会是一个非常大的数字,最多可能不到一千。

模拟的一个重要方面是插件仅在其函数被调用时才允许工作test_cycle。在每个测试周期中,我需要:

  1. 接受来自客户端的任何新连接
  2. 从套接字接收数据并将其转发到模拟
  3. 从模拟接收数据并将其转发给客户端

由于可能有超过 64 个套接字,我不能(轻松)使用WSAEventSelectWSAWaitForMultipleEvents检查是否可以读取套接字,或者客户端是否已正常终止连接。

所以我想到了另外两种我可以做到这一点的方法。

  1. 让每个套接字都是非阻塞的。每次test_cycle调用时,循环遍历所有套接字,尝试接收每个套接字的最大数据量。

  2. 使用 I/O 完成端口并从套接字发出异步接收。在中,使用设置为的参数test_cycle重复调用,直到指示超时 ( ?)。如果发生接收,请将下一个接收调用推迟到测试周期结束,这样客户端向服务器发送垃圾邮件不会导致我们无限期地循环进入(希望如此)。GetQueuedCompletionStatusdwMilliseconds0WAIT_TIMEOUTtest_cycle

模拟接口不是线程安全的,将数据转发到模拟的处理工作很少,所以我认为 I/O 完成端口有工作线程没有任何好处,它只会做一个锁定并调用模拟 API。但是,不必轮询每个套接字可能会带来更好的性能。

那么对于这种规模的应用程序,最多少于 1000 个套接字,通常少于 100 个,使用 I/O 完成端口增加的复杂性是否有任何真正的好处?

0 投票
2 回答
7856 浏览

c# - C# async/await 链与 ConfigureAwait(false)

根据许多书籍和博客(包括这里的优秀文章),很明显,当编写一个公开辅助异步方法(即包装器方法)的 dll 库时,通常认为在内部完成实际异步方法的 I/O 任务是一种最佳实践在这样的线程池线程上(为简洁起见,下面显示的伪代码,我HttpClient用作示例)

这里的关键是使用ConfigureAwait(false)IO 任务完成发生在线程池线程上,而不是在原始线程上下文上,从而潜在地防止死锁。

我的问题是从呼叫者的角度来看的。我对调用者和上述方法调用之间存在多层方法调用的场景特别感兴趣,如下面的示例所示。

仅使用 final 方法就足够了,ConfigureAwait(false)还是应该确保Method1AsyncMethod2Async在内部调用它们的异步方法ConfigureAwait(false)?将它包含在所有这些中间方法中似乎很愚蠢,尤其是如果Method1Async并且Method2Async只是最终调用MyMethodAsync. 有什么想法,请赐教!

使用示例更新 因此,如果我有一个具有以下私有异步方法的库,

我应该确保以下公共重载方法都包括 ConfigureAwait(false) ,如下所示?

0 投票
0 回答
350 浏览

c++ - 将多个作业关联到 IO 完成端口时参数不正确

考虑以下:

1.hCompletionPort被初始化,在 的构造函数中SomeClass,像这样:

2.hJob是“包含”一个进程的作业对象的句柄;3.该方法被多个Job Object调用,因此在将Job关联到Completion Port时存在一对多的映射关系;

注意:这是我用来在每次超出/破坏某个限制时获取消息的一些代码的一部分,稍后。

我通过在运行这个特定片段之前启动有问题的进程(每个限制到一个作业对象)来测试这一点。

问题:

每次将作业对象与完成端口关联时,关联都会失败,并显示:

SetInformationJobObject 失败,错误 87;参数不正确。

但最尴尬的是,在极少数情况下,一切正常。我可以确认这一点,因为我在代码的其他部分(我调用GetQueuedCompletionStatus.

例如,当我几个小时前第一次运行它时,一切都按预期运行。但在那之后,它总是抛出相同的错误消息,当然,我从来没有发现限制被打破的消息。

0 投票
0 回答
226 浏览

sockets - GetQueuedCompletionStatus 在未完成的 WSASend 上成功

我的套接字引擎出现了奇怪的行为。然后引擎使用带有 OVERLAPPED 结构的 IO 完成端口。

我使用(每次调用一个缓冲区)发送了几个数据包,WSASend但有时我成功调用GetQueuedCompletionStatus了传输字节为零的位置!如果我拨打电话WSAGetOverlappedResult(不等待),它会返回WSA_IO_INCOMPLETE.

过了一会儿,我收到一个具有相同重叠结构的新完成数据包,这次传输的字节与缓冲区长度匹配并且WSAGetOverlappedResult没有返回错误。

当数据包仍在队列中时,为什么操作系统会生成完成通知?

0 投票
1 回答
2078 浏览

sockets - 使用 GetQueuedCompletionStatus 和 ERROR_MORE_DATA 的套接字

我正在尝试将 GetQueuedCompletionStatus 与 winsocks 一起使用,但我似乎无法正确使用它。程序如下:

然后我从外部工具将一些网络数据发送到绑定端口。GetQueuedCompletionStatus 返回 FALSE,GetLastError() 返回 ERROR_MORE_DATA,这听起来是正确的,因为我没有在 WSARecvFrom 中提供缓冲区。

问题是如何提供一个缓冲区来实际从失败的 I/O 操作中获取数据?

我尝试使用原始重叠结构发出 WSARecvFrom,但它只是将另一个读取排队,并且在发送更多网络数据之前,对 GetQueuedCompletionStatus 的后续调用不会返回。

在没有重叠结构的情况下调用 WSARecvFrom 会阻塞它,并且在发送更多网络数据之前它也不会返回。

那么,如何正确处理 ERROR_MORE_DATA 而不会丢失第一次操作的数据?

0 投票
2 回答
1898 浏览

winapi - How to force GetQueuedCompletionStatus() to return immediately?

I have hand-made thread pool. Threads read from completion port and do some other stuff. One particular thread has to be ended. How to interrupt it's waiting if it hangs on GetQueuedCompletionStatus() or GetQueuedCompletionStatusEx()?

  • Finite timeout (100-1000 ms) and exiting variable are far from elegant, cause delays and left as last resort.
  • CancelIo(completionPortHandle) within APC in target thread causes ERROR_INVALID_HANDLE.
  • CancelSynchronousIo(completionPortHandle) causes ERROR_NOT_FOUND.
  • PostQueuedCompletionStatus() with termination packet doesn't allow to choose thread.
  • Rough TerminateThread() with mutex should work. (I haven't tested it.) But is it ideologically good?
  • I tried to wait on special event and completion port. WaitForMultipleObjects() returned immediately as if completion port was signalled. GetQueuedCompletionStatus() shows didn't return anything.

I read Overlapped I/O: How to wake a thread on a completion port event or a normal event? and googled a lot.

Probably, the problem itself – ending thread's work – is sign of bad design and all my threads should be equal and compounded into normal thread pool. In this case, PostQueuedCompletionStatus() approach should work. (Although I have doubts that this approach is beautiful and laconic especially if threads use GetQueuedCompletionStatusEx() to get multiple packets at once.)

0 投票
0 回答
381 浏览

winapi - Windows 中追加的异步文件是否保留顺序?

我调用CreateFilewithFILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH | FILE_FLAG_OVERLAPPED然后调用许多WriteFilewithOVERLAPPED结构,其中两者OffsetOffsetHigh成员都设置为0xFFFFFFFF将新数据附加到文件中。

是否保证操作将按照要求的顺序完成?

这对我来说似乎是合乎逻辑的,但我没有看到明确和明确的证据。

来自https://support.microsoft.com/en-us/kb/156932的引用表明操作将是同步的:

在 Windows NT 上,对扩展其长度的文件的任何写操作都是同步的。

伟大的。同步操作保持顺序。但是之后:

FILE_FLAG_NO_BUFFERING标志对异步操作的文件系统行为影响最大。这是保证 I/O 请求实际上是异步的最佳方式。

后来引起了我的怀疑。有人可以澄清一下吗?