2012-01-20 58 views
1

我有在关闭管道死锁:另一个线程读取此管道时关闭管道的死锁?

ssize_t sizeRead = read(myPipeFD, buffer, bufferSize); 

难道是:

close(myPipeFD); 

另一个线程,读线程,处于阻塞此完全相同的管道中读取状态这种僵局的原因?我以为read会立即返回sizeRead == 0?我应该在这个阅读线程中发出中断吗?

+0

我在使用命名管道的osx上遇到同样的问题。有解决方案吗? –

回答

0

出于多种原因,当另一个线程可能正在使用它时关闭文件描述符是不安全的。

正如您发现的那样,如果文件描述符关闭,可能会阻止等待文件描述符的某些系统调用可能会以意外的方式运行。

但还有其他问题。假设第一个线程在之前关闭一个文件描述符,第二个线程在其上输入一个read()调用。我们还假设第三个线程恰好同时打开文件或套接字。新的文件描述符将获得与刚刚关闭的文件相同的编号。第二个线程将从错误的文件描述符中读取!

通常,您需要确保一次只有一个线程在文件描述符上运行。线程应该“拥有”文件描述符。您可以将所有权从一个线程传递给另一个线程,但每次只能拥有一个线程。

如果您需要取消操作,您需要使用非阻塞I/O以及诸如select()之类的内容,以用于需要阻止等待数据时。此外,您需要在select()调用中包含跨线程通信通道(例如管道),这将成为一个线程向另一个线程提交请求以关闭其文件描述符之一的机制。

您还应该考虑调度I/O或异步机制,如运行循环驱动NSFileHandle