gpt4 book ai didi

winapi - Windows 上的命名管道和 OVERLAPPED

转载 作者:行者123 更新时间:2023-12-01 00:52:17 25 4
gpt4 key购买 nike

我即将实现我的第一个 Windows 服务。该服务将连接到蓝牙加密狗,并将一些命令和数据与单个客户端进程联系起来。
每个进程(客户端、服务器)应至少有两个线程——一个阻塞在 Read() 上,另一个处理业务逻辑并偶尔执行 Write()。

检查替代方案,我决定使用 Named Pipes用于 IPC,但我无法理解某些设置。具体来说:

  • 我希望允许同时读取和写入。我需要用 FILE_FLAG_OVERLAPPED 创建管道吗? ,即使我不打算在同一个线程上进行读写?
  • 如果上面的答案是"is",我是否还需要通过 OVERLAPPED结构到 ReadFile() , WriteFile() , 使用 GetOverlappedResult() 等等?如果是这样,这背后的道理是什么?
  • 无论如何,让单个线程进行非阻塞读写有什么好处?有哪些用例?

  • 编辑

    我想澄清这个问题:
  • 假设两个线程(读/写)同时访问管道,由于某些内部管道互斥锁,一个线程会阻塞直到另一个线程完成吗?
  • 将设置FILE_FLAG_OVERLAPPED改变这种行为?
  • 最佳答案

    要启用对管道的双向访问,您必须指定 PIPE_ACCESS_DUPLEX dwOpenMode 参数的标志。 Asynchronous operation ( FILE_FLAG_OVERLAPPED ) 不是严格要求启用双向模式。

    但是,建议对双向管道使用异步 I/O。它允许您在同一线程上同时发出读取和写入操作(请参阅 WaitForMultipleObjects )。任一操作都在 上发出信号完成 .例如,这可以防止冗长的写入操作阻塞潜在的读取,并且您将能够及时响应其中任何一个。也许更重要的是,由于您永远不知道数据何时可用,您通常希望始终发出读取操作,而不会阻塞您的线程。

    这在 CreateNamedPipe 的文档中有所概述。 :

    If [overlapped] mode is enabled, functions performing read, write, and connect operations that may take a significant time to be completed can return immediately. This mode enables the thread that started the operation to perform other operations while the time-consuming operation executes in the background. For example, in overlapped mode, a thread can handle simultaneous input and output (I/O) operations on multiple instances of a pipe or perform simultaneous read and write operations on the same pipe handle. If overlapped mode is not enabled, functions performing read, write, and connect operations on the pipe handle do not return until the operation is finished. The ReadFileEx and WriteFileEx functions can only be used with a pipe handle in overlapped mode. The ReadFile, WriteFile, ConnectNamedPipe, and TransactNamedPipe functions can execute either synchronously or as overlapped operations.

    关于winapi - Windows 上的命名管道和 OVERLAPPED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30450370/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com