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

时间:2009-06-09 20:56:48

标签: c++ c pipe signals unix

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

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

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

如何实施此方案?

以下帖子的更具体案例:

  

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

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

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

请注意,它基于Boost.Thread

答案 2 :(得分:0)

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

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

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

然而,您可能已经使用的库已经为您的平台上的问题提供了解决方案。