我有很多POSIX线程,两个读取器从串口读取,其他读取器使用文件描述符写入同一端口。我如何在它们之间共享相同的描述符?我已经通过信号量在所有线程之间同步了读/写和写/写操作。
注意:我假设应该在同一进程的线程之间共享文件描述符,但是当第二个读取器尝试从端口读取时,我的代码无法以EBUSY
错误运行。 (之前问过question)
更新
这有点奇怪,即使在运行时只有一个线程存在,read()
在write()
返回-l
并且EBUSY
错误后对flush
的任何调用。也许我在问错误的问题。每个write()
之后应该有某种write()
以确保该设备是免费的?或以某种方式迫使{{1}}阻止?
答案 0 :(得分:1)
显然,EBUSY
返回码表示端口正在使用,应该稍后再次查询。您的线程应该稍等一会再试一次,直到命令通过。
您在其中一条评论中提到,端口后面的系统是机械系统,这可以解释为什么可能需要一段时间来处理命令。
我认为“处理IO的一个线程”是最好的方法。每次读/写都会阻塞线程并避免您正在目睹的EBUSY
问题。您剩下要做的就是实现一个命令队列(使用std::queue
或类似的非常简单,只需一个互斥锁来同步所有访问)。
更新:读取您的更新,我猜EBUSY
只是命令执行速度很慢的标志,并且在系统调用返回后完成了一段时间即使一个线程正在执行IO,它也可能会遇到它。正如我在回答的开头所说的那样,让线程在重新发出命令之前稍等一下,这样就可以了。
答案 1 :(得分:0)
使用'O_NONBLOCK'标志打开文件。