多线程:读取/写入管道

时间:2009-11-11 02:25:13

标签: multithreading

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

这没关系:

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

到目前为止这是正确的吗?

现在,有一些我不明白的事情:

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

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

1 个答案:

答案 0 :(得分:2)

我在这里没有回答你的所有问题,因为有很多问题,但是回答:

  

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

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

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

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

INSTRUCTION 1
INSTRUCTION 2

假设您在这两条指令之间进行了线程上下文切换,并且您的读取线程尝试读取处于中间状态的管道。这可能会导致崩溃或(更糟糕的)数据损坏,这些损坏通常会在代码中的其他位置出现崩溃。这通常是由于竞争条件而导致的,这种情况通常是非确定性的,难以诊断或复制。

通常,除非您可以保证所有线程都将使用原子指令集访问共享资源,否则必须使用互斥锁或关键部分。