gpt4 book ai didi

c++ - 什么是 WaitNamedPipe 的重叠 I/O 替代方案?

转载 作者:可可西里 更新时间:2023-11-01 13:24:14 25 4
gpt4 key购买 nike

WaitNamedPipe函数允许管道客户端应用程序同步等待命名管道服务器上的可用连接。然后你调用CreateFile以客户端身份打开管道。伪代码:

// loop works around race condition with WaitNamedPipe and CreateFile
HANDLE hPipe;
while (true) {
if (WaitNamedPipe says connection is ready) {
hPipe = CreateFile(...);
if (hPipe ok or last error is NOT pipe busy) {
break; // hPipe is valid or last error is set
}
} else {
break; // WaitNamedPipe failed
}
}

问题是这些都是阻塞的、同步的调用。异步执行此操作的好方法是什么?例如,我似乎找不到使用重叠 I/O 来执行此操作的 API。例如,对于管道服务器ConnectNamedPipe函数提供了一个 lpOverlapped 参数,允许服务器异步等待客户端。然后管道服务器可以调用 WaitForMultipleObjects并等待 I/O 操作完成,或任何其他事件发出信号(例如,向线程发出信号以取消挂起的 I/O 并终止的事件)。

我能想到的唯一方法是在一个循环中调用 WaitNamedPipe,并在一个短而有限的超时时间内检查其他信号是否超时。或者,在循环调用 CreateFile 中,检查其他信号,然后在短延迟(或 WaitNamedPipe)下调用 Sleep。例如:

HANDLE hPipe;
while (true) {
hPipe = CreateFile(...);
if (hPipe not valid and pipe is busy) {
// sleep 100 milliseconds; alternatively, call WaitNamedPipe with timeout
Sleep(100);
// TODO: check other signals here to see if we should abort I/O
} else
break;
}

但在我看来,这种方法臭不可闻。如果管道暂时不可用,线程会继续运行 - 占用 CPU、耗电、要求内存页面保留在 RAM 中等。在我看来,线程依赖于 Sleep或短超时表现不佳,是草率多线程编程的标志。

但是在这种情况下还有什么选择呢?

最佳答案

WaitNamedPipe 完全没用,如果您指定超时并且没有服务器在等待它,它只会使用所有 cpu。

只需像您正在做的那样用Sleep 一遍又一遍地调用CreateFile,然后将其移动到您认为合适的其他线程。没有 API 替代方案。

WaitNamedPipe 提供的唯一“好处”是,如果您想知道是否可以连接到命名管道,但您明确不想实际打开连接。这是垃圾。

如果你真的想彻底,你唯一的选择是

  • 确保打开命名管道的任何程序总是在命名管道连接到它之后立即再次调用 CreateNamedPipe
  • 让您的程序实际检查该程序是否正在运行。
  • 如果您真的不想有额外的连接,仍然调用 CreateNamedPipe,当有人连接时,告诉他们离开,直到他们等待给定的时间,然后关闭管道.

关于c++ - 什么是 WaitNamedPipe 的重叠 I/O 替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9878596/

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