c++ - 在线程之间共享一个文件描述符

标签 c++ multithreading synchronization pthreads

我有很多 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/

相关文章:

C++ 如何在头文件中使用 cpp 文件中的函数

c++ - 事务中的线程信号

java - 为什么默认情况下 Java 中的变量不是 volatile 的?

python - Django 中的 "management.py"是什么?

linux - 同步两个 Linux 操作系统之间的文件和符号链接(symbolic link)

synchronization - GPU 上的高效桶排序

c++ - 生成 C++ 代码的开源 UML 工具

c++ - 插入和 push_back 指向唯一指针 vector 的指针会产生不同的编译行为?

c++ - 英特尔 SGX 将整数从应用程序传递到 Enclave

python - 确定工作线程是否正在执行任何工作