我正在以阻止的方式从设备/文件描述符中读取。 可能会发生这种情况,即在不同的线程中关闭设备并删除filedescriptor。不幸的是,阅读并没有返回或注意到并且一直阻塞。
作为一种解决方法,我可以使用select作为超时来执行while循环。如果发生超时,我可以检查filedescriptor,如果它没有调用read但返回。
我想知道,如果在Linux-C中有更好的方法吗?
答案 0 :(得分:2)
一旦文件描述符被其他线程关闭,验证它就不容易了。如果其他线程重新打开文件并获得相同的内容该怎么办
文件描述符?在成功close()
调用时,您无法再次访问文件描述符,它将未定义。在失败的close()
调用中,POSIX保留文件描述符unspecified的状态。
select()
选项与上述情况相同。
您的问题与多线程程序中的任何其他data race问题并没有什么不同。我建议你重新写一下 代码,以便线程不会在没有同步的情况下访问文件描述符。或者,如果可能,请避免多个线程从同一个文件描述符中读取。
答案 1 :(得分:2)
您描述的代码具有固有的竞争条件 - 如果您read()
该文件描述符时,如果另一个线程可能在文件描述符上阻塞close()
,则另一个线程也可能是即将调用read()
。
除非您知道所有其他线程根本不再使用该文件描述符,否则您无法调用close()
。
处理像你描述的案件的最简单方法是让一个线程成为拥有'每个文件描述符的线程,负责关闭文件描述符。其他线程不直接关闭它 - 而是将文件描述符标记为"要关闭"在一些共享数据结构中唤醒拥有的线程。
你可以通过让它不在read()
中阻塞来唤醒拥有的线程,而是在select()
或poll()
中阻塞另一个文件描述符 - 通常是一个管道 - 在设置以及目标文件描述符。通过写入该管道的另一端来唤醒该线程。