我正在以阻塞的方式从设备/文件描述符中读取。
可能会发生这样的情况:在不同的线程中,设备被关闭并且文件描述符被删除。不幸的是,读取没有返回或注意到并且一直阻塞。
作为一种解决方法,我可以使用 select 作为超时来执行 while 循环。如果发生超时,我可以检查文件描述符,如果它消失了,则不调用 read 而是返回。
我想知道,Linux-C 是否有更好的方法?
您所描述的代码具有固有的竞争条件 - 如果另一个线程可能处于阻塞状态read()
当您在文件描述符上close()
该文件描述符,另一个线程也可能正要调用read()
反而。
你不能打电话close()
除非您知道所有其他线程根本不再能够使用该文件描述符。
处理您所描述的情况的最简单方法是让一个线程成为每个文件描述符的“拥有”线程,负责关闭文件描述符。其他线程不会直接关闭它 - 相反,它们在某些共享数据结构中将文件描述符标记为“要关闭”并唤醒所属线程。
您可以通过不阻塞来唤醒拥有线程read()
而是阻止select()
or poll()
与集合中的另一个文件描述符(通常是管道)以及目标文件描述符一起。通过写入该管道的另一端来唤醒线程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)