这是一个问题,我早些时候来过这个问题。 基本上,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.
}
答案 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)
您想要使用条件变量。您可以轮询(定时等待)或阻止等待工作线程完成。
答案 4 :(得分:0)
使用并发时,通常有两种算法:挂起和信令。
一个线程可以在事件标志上等待或挂起。处理线程将在处理完成后设置事件。对这种技术的一个棘手是,在设置事件之前停止挂起的线程。
在信令上,控制线程将请求发送到处理任务,然后继续执行其他任务。处理完成后,处理任务将向控制线程发送信号,中断它。控制线程可能偶尔轮询事件标志而不是中断。
在任何一种情况下,信号和事件处理都是操作系统问题,因操作系统而异。 C和C ++语言没有标准的信号和事件处理功能。
答案 5 :(得分:0)
在我们的办公室中,我们使用Boost Signals的略微修改的实现来实现此目的。我们取得了很大的成功。在您的示例中,A
使用信号注册回调函数。当B
完成其工作后,它会调用信号让A
知道它已完成。