首页 文章

WriteFile / ReadFile死锁

提问于
浏览
0

我正在使用管道,我在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的相关信息

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

另一条消息是使用pipe1调度的,收到的,结果再次出现在hProbePipeRet中,客户端正在等待至少BUFSIZE的信息,我不知道服务器在做什么,但它在WriteFile被阻止了 .

这种情况与我的其他管道相同,但我没有将hProbePipeRet放在一个单独的线程中从中读取 . 我这样做是因为我在发送消息后需要一个答案 .

2 回答

  • 2

    也许您遇到了使用阻塞IO的问题 . 对ReadFile的调用会阻塞,直到有东西要读 . 如果你有一个调用write然后读取的循环,它可能会在第二次调用中阻塞 . 也许您应该考虑使用async io . 您使用事件调用readFile . 当有东西要读时,事件会被设置 . 所以不需要创建多个线程 .

  • 0

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

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

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

相关问题