我将一些数据写入管道 - 可能是大量数据并且是随机的。如何从管道中读取数据?
这没关系:
到目前为止这是正确的吗?
现在,有一些我不明白的事情:
select
之类的东西吗?[编辑] 对不起,我认为这个问题与平台无关,但以防万一:我从Win32的角度看这个,可能是MinGW C ......
答案 0 :(得分:2)
我在这里没有回答你的所有问题,因为有很多问题,但是回答:
我必须在写入时锁定(互斥?管道)?
这个问题的答案是特定于平台的,但在大多数情况下,我猜是是。
归结为管道上的写入/读取操作是否是原子的。如果读取或写入操作是非原子的(很可能是写入),那么您将需要在写入和读取时锁定管道以防止竞争条件。
例如,假设对管道的写入在机器代码中编译为2条指令:
INSTRUCTION 1
INSTRUCTION 2
假设您在这两条指令之间进行了线程上下文切换,并且您的读取线程尝试读取处于中间状态的管道。这可能会导致崩溃或(更糟糕的)数据损坏,这些损坏通常会在代码中的其他位置出现崩溃。这通常是由于竞争条件而导致的,这种情况通常是非确定性的,难以诊断或复制。
通常,除非您可以保证所有线程都将使用原子指令集访问共享资源,否则必须使用互斥锁或关键部分。