【问题标题】:Share a file descriptor between threads在线程之间共享文件描述符
【发布时间】:2012-12-03 15:36:16
【问题描述】:

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

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

更新

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

【问题讨论】:

  • 为什么需要并发访问?你不能通过一个线程来避免这种情况,而所有其他线程都在排队读/写命令吗?
  • 文件描述符共享的。您能否在您的问题中添加一些代码,以显示您如何进行锁定和读取?当然,还要考虑重新设计,其中只有一个线程(甚至可能是一个全新的线程)进行读取。
  • @didierc 这样的情况会很难设计
  • 为什么会这么难?
  • @didierc 我需要更改一个复杂的机械控制和平衡系统,我不知道它是如何工作的,因为我的领域是计算机科学,我对力学一无所知。我只能分析系统实现。

标签: c++ multithreading synchronization pthreads


【解决方案1】:

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

你在你的一个 cmets 中提到了端口后面的系统是一个机械系统,这可以解释为什么处理一个命令可能需要一点时间。

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

更新:阅读您的更新,我猜EBUSY 只是命令执行速度非常慢的标志,并且在系统调用返回后一段时间完成,甚至单线程做IO的时候,可能会遇到。正如我在回答开头所说的那样,让线程在重新发出其命令之前稍等片刻,就应该这样做。

【讨论】:

  • 我明天测试一下。谢谢
【解决方案2】:

使用“O_NONBLOCK”标志打开文件。

【讨论】:

  • 这正是我想要避免的。我需要阻止
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 2013-07-02
  • 1970-01-01
  • 2011-03-11
相关资源
最近更新 更多