main()和thread()之间的通信

时间:2014-01-31 11:08:48

标签: c++ c multithreading pthreads

我对线程通信有疑问。 有客户端和服务器。

服务器:

  1. 主要功能 - 它的工作是收听某个端口(TCP通信)并从客户端获取命令
  2. 线程工作是将视频流畅地传输给客户端。
  3. 客户端:

    1. 主要功能 - 向服务器发送命令
    2. 线程 - 观看视频
    3. TCP \ video部分工作正常。 在服务器的主要功能之后,从客户端获取命令,我需要将命令发送到视频线程并从视频线程发送回服务器的主 - “o.k”。

      问题是从服务器的main发送命令到视频线程,反之亦然。

      足够的命令将是一个变量..

      任何想法? 谢谢!

2 个答案:

答案 0 :(得分:1)

管道是双向通信的坏方法,你可以使用共享内存。 在共享内存中,两个进程都可以访问一些可以用于读取或写入的内存,这样一个中的写入在另一个的读取中是可见的,反之亦然。

有关共享内存http://www.cs.cf.ac.uk/Dave/C/node27.html

的更多详细信息

答案 1 :(得分:0)

如果线程和一个变量然后使用原子变量。如果对象然后使用锁定(trylock内部视频流循环和锁定写入命令在主内部)。如果您希望命令为队列,则使用安全的concurent队列

我想你的情况: 我会用两个Wait-free ring buffer来自boost示例。制作两个单一的生产者 - 消费者。在一个生产者中将是主要功能消费者的其他线程,在另一个生产者上反之亦然。 (就像在unix中使用两个管道但是效率很高)

无等待环形缓冲区提供了一种机制,用于将对象从一个“生产者”线程中继到一个单独的“消费者”线程,而不需要任何锁定。对该数据结构的操作是“无等待”,这意味着每个操作在恒定步数内完成。这使得该数据结构适用于硬实时系统或与中断/信号处理器通信。

Wait-free ring buffer

但考虑到我不了解你的情况,可能会有更多正确的方法。也许可以重新考虑