0

我有许多 POSIX 线程,两个读取器从串行端口读取,其他读取器使用文件描述符写入同一端口。如何在它们之间共享相同的描述符?我通过信号量在所有线程之间同步了读/写和写/写操作。

注意:我假设文件描述符应该在同一进程的线程之间共享,但是EBUSY当第二个读取器尝试从端口读取时,我的代码无法运行并出现错误。(之前问过一个问题

更新

这是一个有点奇怪的情况,即使在运行时只有一个线程,对read()after的任何调用都会write()返回错误。也许我问错了问题。每个之后都应该有某种方式来确保该设备是免费的?或以某种方式强制阻止?-lEBUSYflushwrite()write()

4

2 回答 2

1

很明显,EBUSY返回码表明该端口正在使用中,稍后应再次查询。您的线程应该稍等片刻再试一次,直到命令通过。

您在其中一条评论中提到了端口背后的系统是机械系统,这可以解释为什么处理命令可能需要一点时间。

我认为“一个线程处理 IO”是最好的方法。每次读/写都会阻塞线程并避免EBUSY您目睹的问题。您剩下要做的就是实现一个命令队列(非常容易使用std::queue或类似,只需一个互斥锁即可同步所有访问)。

更新:阅读您的更新,我想这EBUSY只是命令执行速度非常慢的迹象,并且在系统调用返回后不久完成,以至于即使一个线程正在执行 IO,它也可能会遇到它。正如我在回答开头所说的那样,让线程在重新发出它的命令之前稍等片刻,就应该这样做。

于 2012-12-16T06:27:29.057 回答
0

打开带有“O_NONBLOCK”标志的文件。

于 2012-12-18T14:33:48.003 回答