C:如果删除了filedescriptor,则应该返回阻塞读取

时间:2016-10-28 09:10:07

标签: c linux multithreading pthreads

我正在以阻止的方式从设备/文件描述符中读取。 可能会发生这种情况,即在不同的线程中关闭设备并删除filedescriptor。不幸的是,阅读并没有返回或注意到并且一直阻塞。

作为一种解决方法,我可以使用select作为超时来执行while循环。如果发生超时,我可以检查filedescriptor,如果它没有调用read但返回。

我想知道,如果在Linux-C中有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

一旦文件描述符被其他线程关闭,验证它就不容易了。如果其他线程重新打开文件并获得相同的内容该怎么办 文件描述符?在成功close()调用时,您无法再次访问文件描述符,它将未定义。在失败的close()调用中,POSIX保留文件描述符unspecified的状态。

select()选项与上述情况相同。

您的问题与多线程程序中的任何其他data race问题并没有什么不同。我建议你重新写一下 代码,以便线程不会在没有同步的情况下访问文件描述符。或者,如果可能,请避免多个线程从同一个文件描述符中读取。

答案 1 :(得分:2)

您描述的代码具有固有的竞争条件 - 如果您read()该文件描述符时,如果另一个线程可能在文件描述符上阻塞close(),则另一个线程也可能是即将调用read()

除非您知道所有其他线程根本不再使用该文件描述符,否则您无法调用close()

处理像你描述的案件的最简单方法是让一个线程成为拥有'每个文件描述符的线程,负责关闭文件描述符。其他线程不直接关闭它 - 而是将文件描述符标记为"要关闭"在一些共享数据结构中唤醒拥有的线程。

你可以通过让它不在read()中阻塞来唤醒拥有的线程,而是在select()poll()中阻塞另一个文件描述符 - 通常是一个管道 - 在设置以及目标文件描述符。通过写入该管道的另一端来唤醒该线程。