首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WriteFile/ReadFile的死锁

WriteFile/ReadFile的死锁
EN

Stack Overflow用户
提问于 2011-10-14 14:42:26
回答 2查看 3.3K关注 0票数 0

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

代码语言:javascript
复制
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 

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

代码语言:javascript
复制
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 

我收到的回信是:

代码语言:javascript
复制
        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放在单独的线程中进行读取。我这样做是因为我需要在发送完邮件后立即得到答复。

EN

回答 2

Stack Overflow用户

发布于 2011-10-14 15:03:36

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

票数 2
EN

Stack Overflow用户

发布于 2011-10-14 15:08:03

使用PIPE_TYPE_BYTEPIPE_READMODE_BYTE而不是消息计数器部分。此外,在任何客户端连接之前,服务器都不能执行任何阻塞读取操作。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7763958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档