Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 多线程:读取/写入管道_Multithreading - Fatal编程技术网

Multithreading 多线程:读取/写入管道

Multithreading 多线程:读取/写入管道,multithreading,Multithreading,我向管道中写入一些数据——可能是大量数据,并且以随机间隔写入。如何从管道中读取数据 这样行吗: 在主线程(当前进程)中,再创建两个线程(2,3) 第二个线程有时写入管道(并刷新管道?) 第三个线程具有读取管道的无限循环(然后休眠一段时间) 到目前为止这是正确的吗 现在,有几件事我不明白: 我必须在写入时锁定(互斥?)管道吗 IIRC,当写入管道且其缓冲区已满时,写入端将阻塞,直到我读取已写入的数据,对吗?如何检查管道中的读取数据,不是太频繁,也不是太少?这样第二根线就不会阻塞了?是否有类似

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

这样行吗:

  • 在主线程(当前进程)中,再创建两个线程(2,3)
  • 第二个线程有时写入管道(并刷新管道?)
  • 第三个线程具有读取管道的无限循环(然后休眠一段时间)
到目前为止这是正确的吗

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

  • 我必须在写入时锁定(互斥?)管道吗
  • IIRC,当写入管道且其缓冲区已满时,写入端将阻塞,直到我读取已写入的数据,对吗?如何检查管道中的读取数据,不是太频繁,也不是太少?这样第二根线就不会阻塞了?是否有类似于管道的
    select
  • 可以将管道设置为无缓冲或定期冲洗-哪一个更好
  • 我是否应该再创建一个线程,仅用于写入后冲洗管道?因为当缓冲区满的时候,flush也会阻塞,对吗?我只是不想让第一和第二个线程阻塞
[编辑]
抱歉,我认为这个问题与平台无关,但以防万一:我是从Win32的角度来看这个问题的,可能是MinGW C.。

我不是在这里回答你所有的问题,因为有很多问题,但作为对以下问题的回答:

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

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

这取决于管道上的写/读操作是否是原子操作。如果读操作或写操作是非原子的(最有可能是写操作),那么您需要在写操作和读操作时锁定管道,以防止争用情况

例如,假设对管道的写入以机器代码形式编译成2条指令:

INSTRUCTION 1
INSTRUCTION 2
假设您在这两条指令之间得到一个线程上下文切换,并且您的读取线程尝试读取处于中间状态的管道。这可能会导致崩溃,或者(更糟的)数据损坏,这通常会在代码的其他地方发生崩溃。这通常是由于比赛条件造成的,比赛条件通常是不确定的,难以诊断或再现


一般来说,除非您能够保证所有线程都将使用原子指令集访问共享资源,否则您必须使用互斥锁或关键部分。

这些都是很好的问题。如果你把他们分成他们自己的问题,并提供你正在考虑的方法的代码片段,你会得到更好的回答。另外,你没有提到任何关于语言或平台的内容。同意凯利的说法。我们需要更多的信息。所有这些问题都可以有特定于平台和语言的答案。此外,您打算用于“管道”的数据结构将是有用的信息。哦,对不起,我认为平台没有那么重要,因为我假设问题与技术有关。但是我刚刚更新了问题,谢谢你的建议。无论数据结构如何,只有缓冲区,它只是一个数组……当操作系统序列化时,对管道的
write()
写入短消息是安全的。如果您依赖于此,则强烈建议只使用长度为2的小幂次方的消息(即,可精确划分为内存页),这样写操作就不会在写了一半的消息时暂停。