問題タブ [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.
ios - iOS/objective-c(++) は Windows I/O Completion Ports と同等ですか?
ファイルを非同期的にロードし、結果としてファイルのコンテンツを含むタスクを返すメソッドを実装したいとします。.NET では、次のように言えます。
内部では、CopyToAsync
IO 完了ポートを利用して、IO を待っているスレッドがアイドリングで無駄にならないようにします。
Objective-C(++)に同等のものはありますか? 次のコントラクトを効率的に実装できますか?
c# - IOCompletionCallback で AccessViolationException を取得する
アプリケーションの起動時に次の例外が発生します。
それがコールスタック全体です。アプリケーションの起動時に実行されるのは 20 回に 1 回だけです。ソケット コードで IOCompletion を使用します。それと関係があると思います。しかし、私が電話したときにこの例外が表示されないのはなぜSocket.ReceiveFromAsync
ですか? を同時に呼び出すソケットがたくさんありますReceiveFromAsync
が、同じソケットで同時に 2 回呼び出すことはありません。原因についてのアイデアはありますか?
c++ - 小規模なシングル スレッド アプリケーション用の I/O 完了ポート?
私は I/O Completion Ports を何年も前から聞いていましたが、一度も使用したことがないと言って前に付けておきます。私のバックグラウンドは主にselect
、poll
、epoll
、およびWSAEventSelect
ですWaitForMulitpleObjects
。次のテキストの I/O Completion Ports について根本的な誤解がある場合は、訂正してください。
仕事中のプロジェクトの一環として、クライアントがプラグインに接続し、TCP 経由でシミュレーションとの間でデータを送受信できるようにするプラグイン (DLL) をシミュレーションに開発する任務を負っています。プラグインはサーバーとして機能します。シミュレーションは、別の (イーサネットではない) インターフェイスの通信チャネルをシミュレートします。この特定のアプリケーションでは、チャネルごとに 1 つのソケットを持つことが理にかなっています。いくつのクライアントが存在するか、または各クライアントによっていくつのチャネル (ソケット) が開かれるかはわかりません。ただし、64 を超える可能性が十分にあり、それが異常に多くないこと、おそらくせいぜい 1000 未満であることはわかっています。
シミュレーションの重要な側面は、関数が呼び出されたときにのみプラグインが動作できることですtest_cycle
。各テスト サイクル中に、次のことを行う必要があります。
- クライアントからの新しい接続を受け入れる
- ソケットからデータを受信し、シミュレーションに転送します
- シミュレーションからデータを受け取り、クライアントに転送します
64 を超えるソケットが存在する可能性があるため、(簡単に) WSAEventSelect
andWSAWaitForMultipleEvents
を使用して、ソケットを読み取れるかどうか、またはクライアントが正常に接続を終了したかどうかを確認することはできません。
そのため、これを行うことができる他の 2 つの方法を考えました。
各ソケットをノンブロッキングにします。が呼び出されるたび
test_cycle
に、ソケットごとに最大量のデータを受信しようとして、すべてのソケットをループします。I/O Completion Port を使用して、ソケットから非同期受信を発行します。で、タイムアウトが示される ( ?)まで、パラメーターを に設定して呼び出しを
test_cycle
繰り返します。受信が発生した場合は、テスト サイクルが終了するまで次の受信呼び出しを延期します。これにより、クライアントがサーバーにメッセージをスパム送信しても、無期限にループすることはありません(うまくいけば)。GetQueuedCompletionStatus
dwMilliseconds
0
WAIT_TIMEOUT
test_cycle
シミュレーションへのインターフェイスはスレッドセーフではなく、データをシミュレーションに転送するために行う処理作業はほとんどないため、I/O 完了ポートにワーカー スレッドを使用するメリットはないと思います。 、ロックを実行してシミュレーション API を呼び出すだけです。ただし、各ソケットをポーリングする必要がないため、パフォーマンスが向上する場合があります。
この規模のアプリケーションでは、最大ソケット数が約 1000 未満、通常は 100 未満ですが、I/O Completion Ports を使用することで複雑さが増すことに、実際にメリットはあるのでしょうか?
c++ - 多くのジョブを IO 完了ポートに関連付けるときのパラメーターが正しくない
次の点を考慮してください。
1.hCompletionPort
のコンストラクターでSomeClass
、次のように初期化されます。
2.hJob
プロセスを 1 つだけ「含む」ジョブ オブジェクトへのハンドルです。3.このメソッドは複数のジョブ オブジェクトに対して呼び出されるため、ジョブを完了ポートに関連付ける際には 1 対多のマッピングが存在します。
注:これは、後で特定の制限を超えたり破ったりするたびにメッセージを取得するために使用するコードの一部です。
この特定のスニペットが実行される前に、問題のプロセス (それぞれ 1 つのジョブ オブジェクトに限定されます) を起動して、これをテストします。
問題:
ジョブ オブジェクトが完了ポートに関連付けられるたびに、関連付けは次のエラーで失敗します。
SetInformationJobObject がエラー 87 で失敗しました。パラメータが正しくありません。
しかし、最も厄介なことは、まれに、すべてが正常に機能することです。これを確認できるのは、コードの他の部分で期待していたメッセージが表示されるためですGetQueuedCompletionStatus
。
たとえば、数時間前にこれを初めて実行したとき、すべてが期待どおりに機能しました。しかし、その後は常に同じエラー メッセージが表示され、もちろん、制限が破られているというメッセージをキャッチすることはありませんでした。
sockets - GetQueuedCompletionStatus と ERROR_MORE_DATA を使用するソケット
Winsocks で GetQueuedCompletionStatus を使用しようとしていますが、うまくいかないようです。手順は次のとおりです。
次に、外部ツールからネットワーク データをバインドされたポートに送信します。GetQueuedCompletionStatus は FALSE を返し、GetLastError() は ERROR_MORE_DATA を返します。WSARecvFrom でバッファを提供していなかったため、これは正しいように思えます。
問題は、失敗した I/O 操作から実際にデータを取得するためのバッファーをどのように提供できるかということです。
元のオーバーラップ構造で WSARecvFrom を発行しようとしましたが、別の読み取りをキューに入れるだけで、その後の GetQueuedCompletionStatus の呼び出しは、ネットワーク データがさらに送信されるまで返されません。
重複した構造体なしで WSARecvFrom を呼び出すと、それがブロックされ、さらにネットワーク データが送信されるまで戻りません。
では、最初の操作でデータを失うことなく、ERROR_MORE_DATA を適切に処理するにはどうすればよいでしょうか?
winapi - GetQueuedCompletionStatus() を強制的に返す方法は?
私は手作りのスレッドプールを持っています。スレッドは完了ポートから読み取り、その他の処理を行います。1 つの特定のスレッドを終了する必要があります。GetQueuedCompletionStatus() または GetQueuedCompletionStatusEx() でハングした場合、待機を中断する方法は?
- 有限のタイムアウト (100 ~ 1000 ミリ秒) と変数の終了は、エレガントとはほど遠いものであり、遅延を引き起こし、最後の手段として残されています。
- ターゲット スレッドの APC 内の CancelIo(completionPortHandle) が原因
ERROR_INVALID_HANDLE
です。 - CancelSynchronousIo(completionPortHandle) が原因
ERROR_NOT_FOUND
です。 - 終了パケットを含む PostQueuedCompletionStatus() では、スレッドを選択できません。
- ミューテックスを使用した大まかな TerminateThread() は機能するはずです。(私はそれをテストしていません。)しかし、それはイデオロギー的に良いですか?
- 催事と完成ポートで待ち合わせしてみました。
WaitForMultipleObjects()
完了ポートが通知されたかのように、すぐに返されます。GetQueuedCompletionStatus()
ショーは何も返しませんでした。
Overlapped I/O: How to wake a thread on a completion port event or normal event?を読みました。そしてたくさんググった。
おそらく、スレッドの作業を終了するという問題自体は、設計が悪いことの兆候であり、すべてのスレッドが等しくなり、通常のスレッド プールに合成されるはずです。この場合、 PostQueuedCompletionStatus() アプローチが機能するはずです。(特に、スレッドが GetQueuedCompletionStatusEx() を使用して一度に複数のパケットを取得する場合、このアプローチが美しく簡潔であるとは思えませんが。)