【问题标题】:How can I pass data from a thread to the parent process?如何将数据从线程传递到父进程?
【发布时间】:2009-06-09 20:56:48
【问题描述】:

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

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

我想我需要使用管道和信号。我还从各种新闻组中了解到我需要使用“自我欺骗”管道。

这个场景应该如何实现?

以下帖子的更具体案例:

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

【问题讨论】:

  • 亲爱的“反对者”,我能做些什么来提高这个问题的质量吗?你到底不喜欢我的问题是什么?谢谢
  • 丰富,它不相关,而是一种延续。请在编辑我的帖子之前告诉我。谢谢,妈妈
  • 你说的是线程还是进程?你的问题有点令人困惑。

标签: c++ c pipe signals unix


【解决方案1】:

为什么不使用简单的 FIFO(命名管道)?主进程将自动阻塞,直到它可以读取某些内容。
如果它不应该阻塞,则必须可以进行轮询,但可能会占用 CPU。为此目的可能存在一个高效的库。

我不建议使用信号,因为它们很容易出错。如果您仍然想使用它们,我找到的最简单的方法是:

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

优点是您不必再担心从处理程序调用哪个函数是安全的。

【讨论】:

  • 这很接近我的需要。它不应该阻塞。
【解决方案2】:

我强烈建议您使用线程安全队列,例如 this one(文章和源代码)。我个人使用过它,使用起来非常简单。 API 包含简单的方法,例如 push()、try_pop()、wait_and_pop() 和 empty()。

请注意,它基于Boost.Thread

【讨论】:

    【解决方案3】:

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

    最后一个问题的原因是当前的 C++03 标准没有“线程”的概念。这尤其意味着您的操作系统和线程库提供的任何解决方案都是特定于平台的。最便携的解决方案只会在实施过程中对您隐藏这些细节。

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

    但是,您使用的任何库都可能已经在您的平台上为您的问题提供了解决方案。

    【讨论】:

    • 我认为从我正在使用 POSIX/LINUX 和 pthread 库的问题中可以明显看出......呃,抱歉,如果不是,我会澄清这个问题
    猜你喜欢
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 2018-01-30
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    相关资源
    最近更新 更多