【问题标题】:Multithreading: Read from / write to a pipe多线程:读取/写入管道
【发布时间】:2009-11-11 02:25:13
【问题描述】:

我将一些数据写入管道 - 可能是大量数据并且以随机间隔写入。如何从管道中读取数据?

这样可以吗:

  • 在主线程(当前进程)中再创建两个线程(2、3)
  • 第二个线程有时会写入管道(并刷新管道?)
  • 第三个线程有无限循环读取管道(然后休眠一段时间)

到目前为止,这是否正确?

现在,有几件事我不明白:

  • 是否必须在写入时锁定(互斥?)管道?
  • IIRC,当写入管道并且其缓冲区已满时,写入端将阻塞,直到我读取已经写入的数据,对吗?如何检查管道中的读取数据,不是太频繁,也不是太少?所以第二个线程不会阻塞?有类似select 的管道吗?
  • 可以将管道设置为无缓冲更多,或者我必须定期冲洗它 - 哪个更好?
  • 是否应该再创建一个线程,仅用于在写入后刷新管道?因为刷新块也是如此,当缓冲区已满时,对吗?我只是不想让第一个和第二个线程阻塞....

[编辑] 抱歉,我认为这个问题与平台无关,但以防万一:我从 Win32 的角度来看这个问题,可能是 MinGW C...

【问题讨论】:

  • 这些都是很好的问题。如果您将它们分解为自己的问题并提供您正在考虑的方法的代码 sn-ps,您将获得更好的响应。此外,您没有提及任何有关语言或平台的内容。
  • 同意凯利。我们需要更多的信息。所有这些问题都可能有特定于平台和语言的答案。此外,您打算用于“管道”的数据结构将是有用的信息。
  • 哦,对不起,我认为平台并不是那么重要,因为我认为问题在于技术。但我刚刚更新了问题,谢谢你的建议。而数据结构是什么,只有缓冲区,它只是一个数组....

标签: multithreading


【解决方案1】:

我不会在这里回答你所有的问题,因为它们有很多,但要回答:

我是否必须在写入时锁定(互斥?)管道?

这个问题的答案是特定于平台的,但在大多数情况下,我猜是的

归结为管道上的写/读操作是否是原子的。如果 readwrite 操作是非原子的(很可能是写入),那么您需要在写入和读取时锁定管道以防止出现竞争条件。

例如,假设对管道的写入编译为机器代码中的 2 条指令:

INSTRUCTION 1
INSTRUCTION 2

假设您在这 2 条指令之间进行了线程上下文切换,并且您的 reading 线程尝试读取处于中间状态的管道。这可能会导致崩溃,或者(更糟糕的)数据损坏,这通常会在代码中的其他地方出现崩溃。这通常是由于竞态条件而发生的,这些条件通常是不确定的并且难以诊断或重现。

一般来说,除非您可以保证所有线程都将使用原子指令集访问共享资源,否则您必须使用互斥锁或临界区。

【讨论】:

  • 管道的write() 对于短消息是安全的,因为操作系统会序列化。如果您依赖于此,强烈建议仅使用长度为 2 的小幂的消息(即,完全可分为内存页),这样写入永远不会停止写了一半的消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多