关闭管道时死锁,而另一个线程读取此管道?

时间:2012-01-20 10:20:04

标签: macos pipe deadlock

关闭管道我遇到了僵局:

close(myPipeFD);

另一个线程,读取线程,从这个完全相同的管道处于阻塞读取状态:

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

这可能是造成这种僵局的原因吗?我以为read会立即返回sizeRead == 0?我应该在这个阅读线程中发出中断吗?

1 个答案:

答案 0 :(得分:0)

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

正如您所发现的,如果该文件描述符被关闭,一些可以阻止等待文件描述符的系统调用可能会以意想不到的方式运行。

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

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

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

您还应该研究Dispatch I / O或异步机制,如运行循环驱动的NSFileHandle