c ++对象之间的通信

时间:2010-04-08 19:25:31

标签: c++

这是一个问题,我早些时候来过这个问题。 基本上,c ++对象有一个成员对象可以完成一些工作,一旦工作完成,就需要向父进行通知。 什么是允许这种沟通的最优雅的解决方案。 处于这个位置是否表明设计开始存在缺陷?

详细说明。

class A {
  B member;
  void do_something();
}

class B{
 void talk_to_network();
};


void do_something()
{
   //Conditional wait on a variable that will change when talk to network completes.
   //So need a way for B to inform A, that it is done.

}

6 个答案:

答案 0 :(得分:2)

除非您在谈论并发(线程),否则从操作返回结果的常用方法是从函数返回值。

这可能取决于“成员对象”的含义。你的意思是某个类的数据成员吗?

class A { };

class B
{
    A member;
};

如果A具有“做一些工作”的成员函数,那么该成员函数应该(首先近似)将结果作为其正常返回值返回。这是做这种事情最简单的方法。因此B调用该方法并返回结果。

如果必须返回多个结果,您可以将类似函数的对象传递给A的成员函数,以便它可以回调它。

答案 1 :(得分:2)

实施的最佳方式可能是Observer pattern。这是一种类似模式的事件。

答案 2 :(得分:2)

由于您显然正在处理多线程,因此正常的方法是在do_something调用talk_to_network时将某种信令变量的地址从A传递给B.用于信令的确切类型因操作系统而异 - 对于Windows,您可能使用Event。如果您正在使用pthread,那么您可能会使用condition variable来发送信号。

答案 3 :(得分:0)

您想要使用条件变量。您可以轮询(定时等待)或阻止等待工作线程完成。

如果你使用boost:http://www.boost.org/doc/libs/1_42_0/doc/html/thread/synchronization.html#thread.synchronization.condvar_ref

答案 4 :(得分:0)

使用并发时,通常有两种算法:挂起和信令。

一个线程可以在事件标志上等待或挂起。处理线程将在处理完成后设置事件。对这种技术的一个棘手是,在设置事件之前停止挂起的线程。

在信令上,控制线程将请求发送到处理任务,然后继续执行其他任务。处理完成后,处理任务将向控制线程发送信号,中断它。控制线程可能偶尔轮询事件标志而不是中断。

在任何一种情况下,信号和事件处理都是操作系统问题,因操作系统而异。 C和C ++语言没有标准的信号和事件处理功能。

答案 5 :(得分:0)

在我们的办公室中,我们使用Boost Signals的略微修改的实现来实现此目的。我们取得了很大的成功。在您的示例中,A使用信号注册回调函数。当B完成其工作后,它会调用信号让A知道它已完成。