写文件/读文件死锁
Deadlock with WriteFile/ReadFile
我正在使用管道,我在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_BYTE
和PIPE_READMODE_BYTE
代替MESSAGE计数器部分。在任何客户端连接之前,服务器不能执行任何阻塞读取操作。
见http://msdn.microsoft.com/en-us/library/windows/desktop/aa365150 (v = vs.85) . aspx
编辑:对于"必须不执行任何阻塞读操作":根据文档,这可能会导致竞争条件,实际上可能是您的情况,但是如果没有看到更多的代码,很难判断。
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何在没有死锁和/或争用的情况下正确使用 std::mutex C++?
- 用C++中的std::condition_variable将线程置于死锁中会有风险吗
- 使用 std::async 时死锁,将来作为成员
- 如何调试读写器锁的死锁?
- 为什么在Visual Studio 2013上的std::this_thread::sleep_for上死锁
- localtime() 函数正在调用 ___lll_lock_wait_private(),这会使线程陷入死锁
- 如何重现 Boost 进程文档提示的死锁?
- 多线程Windows GUI应用程序中的死锁
- 为什么printf会导致与future.get的死锁,而cout则不会?
- C++中具有阻塞队列和障碍的死锁
- 死锁使用 std::mutex 来保护多个线程中的 cout
- 避免并发等待对象中的死锁
- 在VC++中从DLLMAIN内部调用D3D的CREATEDEVICE时,它会创建一个死锁(loaderlock?)。有没有办法克服这个问题?最终目标内
- 当用2个螺纹锁定时,将recursive_mutex死锁
- 程序在 C++11 中使用条件变量进入死锁
- 一个线程提升的死锁
- 单个生产者/多个消费者死锁
- 当被调用方法使用调用方已锁定的同一锁时,如何避免死锁
- 写文件/读文件死锁