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