在线程之间共享文件描述符

时间:2012-12-16 05:37:12

标签: c++ multithreading synchronization pthreads

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

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

更新

这有点奇怪,即使在运行时只有一个线程存在,read()write()返回-l并且EBUSY错误后对flush的任何调用。也许我在问错误的问题。每个write()之后应该有某种write()以确保该设备是免费的?或以某种方式迫使{{1}}阻止?

2 个答案:

答案 0 :(得分:1)

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

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

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

更新:读取您的更新,我猜EBUSY只是命令执行速度很慢的标志,并且在系统调用返回后完成了一段时间即使一个线程正在执行IO,它也可能会遇到它。正如我在回答的开头所说的那样,让线程在重新发出命令之前稍等一下,这样就可以了。

答案 1 :(得分:0)

使用'O_NONBLOCK'标志打开文件。