代码之家  ›  专栏  ›  技术社区  ›  Sasha

如何将数据从线程传递到父进程?

  •  1
  • Sasha  · 技术社区  · 17 年前

    我有一个使用单线程库的主进程,我只能从主进程获取库函数。我有一个由父进程生成的线程,它将从网络接收到的信息放入队列。

    我需要能够告诉主进程队列中有东西。然后它可以访问队列并处理对象。线程无法处理这些对象,因为库只能由一个进程调用。

    我想我需要使用管道和信号。我还从不同的新闻组里读到,我需要使用“自我欺骗”管道。

    这个场景应该如何实现?

    How can unix pipes be used between main process and thread?

    3 回复  |  直到 6 年前
        1
  •  2
  •   Bastien Léonard    17 年前

    为什么不使用一个简单的FIFO(命名管道)?主进程将自动阻止,直到它可以读取某些内容。
    如果它不应该阻塞,则必须可以改为轮询,但可能会占用CPU。可能有一个高效的图书馆可以做到这一点。

    我不建议使用信号,因为它们很容易出错。如果你想使用它们,我发现最简单的方法是:

    • 屏蔽每个线程中的所有信号,
    • 一个特殊的线程用 sigwait() . 它可能需要唤醒另一个线程来处理信号,例如使用条件变量。

        2
  •  0
  •   Benoît photo_tom    17 年前

    我强烈建议您使用线程安全队列,例如 this one

    请注意,它是基于 Boost.Thread

        3
  •  0
  •   Tobias    17 年前

    “最佳”解决方案在很大程度上取决于您的具体设置。你有一个进程,有一个主线程和一个子线程,还是有一个父进程和一个子进程?您使用哪个操作系统和哪个线程库?

    最后一个问题的原因是当前的C++ 03标准没有“线程”的概念。这尤其意味着,无论您的操作系统和线程库提供什么解决方案,都是特定于平台的。最可移植的解决方案只会在它们的实现中对您隐藏这些细节。

    特别地,C++在其内存模型中没有线程的概念,它也没有原子操作、同步、有序存储器访问、竞争条件等概念。

    然而,不管您使用什么库,都有可能在您的平台上为您的问题提供解决方案。