gpt4 book ai didi

c++ - WriteFile/ReadFile 死锁

转载 作者:行者123 更新时间:2023-11-28 03:45:48 26 4
gpt4 key购买 nike

我正在使用管道,但在 WriteFile/ReadFile 上遇到了一种死锁。这是我的代码:

hProbePipeRet = CreateNamedPipe( 
"\\\\.\\pipe\\probePipeRet", // pipe name
PIPE_ACCESS_DUPLEX, // read/write access
PIPE_TYPE_MESSAGE | // message type pipe
PIPE_READMODE_MESSAGE | // message-read mode
PIPE_WAIT, // blocking mode
PIPE_UNLIMITED_INSTANCES, // max. instances
BUFSIZE, // output buffer size
BUFSIZE, // input buffer size
5, // client time-out
NULL); // default security attribute

首先我创建了我的管道,然后我在另一个应用程序中像这样使用它:

WriteFile( 
hProbePipeRet, // handle to pipe
msg.c_str(), // buffer to write from
msg.size(), // number of bytes to write
&dwBytesWritten, // number of bytes written
NULL); // not overlapped I/O

然后我收到它:

        fSuccess = ReadFile( 
myInst->hProbePipeRet, // handle to pipe
buf, // buffer to receive data
BUFSIZE, // size of buffer
&dwBytesRead, // number of bytes read
NULL); // not overlapped I/O

这是非常基本的,我还有两个管道做完全相同的事情,唯一的区别是它们在不同的线程中,但我只需要这个用于消息的基本事务处理。

第一次尝试时,管道上的信息被成功读取,但第二次尝试时,如果我不发送至少 BUFSIZE 的数据,WriteFile 和 ReadFile 都会阻塞。正如我所说,我还有两个管道做同样的事情,具有相同的功能,而且我不需要发送 BUFSIZE 的数据来进行成功的通信。

编辑:附加信息

执行过程如下:一条消息通过 pipe1 发送到服务器,消息被接收,然后它在我有问题的代码中使用 hProbePipeRet 返回数据。数据由客户端读取,打印到屏幕上。

另一条消息使用 pipe1 发送,收到,结果再次进入 hProbePipeRet,客户端正在等待至少 BUFSIZE 的信息,我不知道服务器在做什么,但它在 WriteFile 处被阻止。

这种情况与我的其他管道相同,但我没有将 hProbePipeRet 放在单独的线程中以从中读取。我这样做是因为我需要在发送消息后立即得到答复。

最佳答案

也许您遇到了使用阻塞 IO 的问题。对 ReadFile 的调用会阻塞,直到有内容可读为止。如果您有一个先调用写入然后读取的循环,它可能会在第二次调用时阻塞。也许你应该考虑使用异步 io。您使用事件调用 readFile。当有内容可读时,事件就会被设置。所以不需要创建多线程。

关于c++ - WriteFile/ReadFile 死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7763958/

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