写文件/读文件死锁



我正在使用管道,我在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的调用阻塞,直到有东西可读。如果你有一个循环调用写,然后读,它可能会阻塞在第二次调用。也许你应该考虑使用async io。使用一个事件调用readFile。当有东西可读时,设置事件。因此,不需要创建多个线程。

使用PIPE_TYPE_BYTEPIPE_READMODE_BYTE代替MESSAGE计数器部分。在任何客户端连接之前,服务器不能执行任何阻塞读取操作。

见http://msdn.microsoft.com/en-us/library/windows/desktop/aa365150 (v = vs.85) . aspx

编辑:对于"必须不执行任何阻塞读操作":根据文档,这可能会导致竞争条件,实际上可能是您的情况,但是如果没有看到更多的代码,很难判断。

最新更新