gpt4 book ai didi

multithreading - 多线程:读取/写入管道

转载 作者:行者123 更新时间:2023-12-03 13:01:36 25 4
gpt4 key购买 nike

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

这个可以吗:

  • 在主线程中(当前进程)再创建两个线程(2、3)
  • 第二个线程有时将信息写入管道(并冲洗管道吗?)
  • 第三线程具有无限循环,该循环读取管道(然后休眠一段时间)

  • 到目前为止,这正确吗?

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

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

    最佳答案

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

    do I have to lock (mutex?) the pipe on write?



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

    这取决于管道上的写/读操作是否是原子的。如果读取或写入操作不是原子性的(很可能是写入操作),则您将需要在写入和读取时锁定管道,以防止出现竞争情况。

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

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

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

    关于multithreading - 多线程:读取/写入管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1712616/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com