我正在使用管道,我在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
这是非常基本的,我还有两个管道,EXACLY做同样的事情,唯一的区别是它们在不同的线程中,但我只需要这个消息的基本事务。
第一次尝试时,管道上的信息被成功读取,但在第二次尝试时,如果我不发送至少BUFSIZE数据,则WriteFile和ReadFile都将被阻塞。正如我所说,我还有两个管道做同样的事情,具有相同的功能,我不需要发送BUFSIZE数据来成功通信。
编辑:Additionnal infos
执行如下:通过pipe1向服务器发送消息,接收消息然后在我有问题的代码中使用hProbePipeRet返回数据。客户端读取数据,打印到屏幕上。
使用pipe1调度另一条消息,收到并且结果再次出现在hProbePipeRet中,客户端至少等待信息的BUFSIZE,我不知道服务器正在做什么,但它在WriteFile上被阻止。
这个场景与我的其他管道相同,但是我没有把hProbePipeRet放在一个单独的线程中来读取它。我这样做是因为我在发送消息后需要一个答案。
答案 0 :(得分:2)
也许您遇到了使用阻止IO的问题。对ReadFile的调用会阻塞,直到有东西要读。如果你有一个调用write然后读取的循环,它可能会在第二次调用中阻塞。 也许您应该考虑使用async io。您使用事件调用readFile。当有东西要读时,事件会被设置。所以不需要创建多个线程。
答案 1 :(得分:0)
使用PIPE_TYPE_BYTE
和PIPE_READMODE_BYTE
代替MESSAGE计数器部分。在任何客户端连接之前,服务器也不得执行任何阻塞读取操作。
请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/aa365150(v=vs.85).aspx
编辑:对于'必须不执行任何阻塞读取操作':根据文档可能导致实际上可能是您的情况的竞争条件,但是如果没有看到更多代码,很难判断。 / p>