Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 在另一个线程读取此管道时关闭管道时发生死锁?_Macos_Pipe_Deadlock - Fatal编程技术网

Macos 在另一个线程读取此管道时关闭管道时发生死锁?

Macos 在另一个线程读取此管道时关闭管道时发生死锁?,macos,pipe,deadlock,Macos,Pipe,Deadlock,我在关闭管道时遇到了僵局: close(myPipeFD); 另一个线程,即读取线程,从同一管道处于阻塞读取状态: ssize_t sizeRead = read(myPipeFD, buffer, bufferSize); 这可能是造成这种僵局的原因吗?我以为read会立即返回sizeRead==0?我应该在此读取线程中发出中断吗?当另一个线程可能正在使用文件描述符时,出于以下几个原因,关闭文件描述符是不安全的 正如您所发现的,如果关闭了文件描述符,一些可能阻止等待文件描述符的系统调用可能

我在关闭管道时遇到了僵局:

close(myPipeFD);
另一个线程,即读取线程,从同一管道处于阻塞读取状态:

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

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

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

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

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

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

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


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

我在osx上遇到了与命名管道相同的问题。有解决办法吗?