2011-04-12 92 views
1

亲爱的C++专业人士。我遇到了问题。我有一个程序,它有1个抽象类base_class和2个派生类:sippeers和dbget。它也有2个线程。第一个线程从用户处获得命令,第二个线程处理这些命令。两个派生类都代表不同的命令。所以,我必须创建某种堆栈,我应该在第一个线程中放置用户命令,并在第二个线程中处理它们。为了为所有命令创建一个堆栈,我必须使用多态。首先,我试图使用std :: list。但是有第一个问题:我不能列出抽象类。然后我尝试使用boost :: ptr_list,但还有第二个问题:在第一个线程中创建的类随着过程结束而消失,创建它们。所以指针变得非法。问题:我应该使用什么样的实现?看起来我必须存储派生类的每个副本。但是哪里?堆栈的polymorphed类

回答

1

shared_ptr<base_class>的std ::队列是将类从1个线程传递到另一个线程的最直接的解决方案,无需担心内存管理问题。结合一个条件变量来表明队列不是空的,所以消费者线程可以等待。

对于多态性部分,有一个额外的虚函数(execute()?),所以消费线程不应该知道它实际接收了什么类。

+0

它是解决方案吗?我可以用 的std ::列表<提高:: shared_ptr的>命令 第一个线程可以把指针进入这个名单,第二个线程可以这样做: 而 { base_command C =命令(commands.empty()!) 。面前(); commands.pop_front(); } – CagoBHuK 2011-04-12 10:06:17

+0

除了shared_ptrs(我们当时不知道),这是我们使用的(简化的)解决方案。我们使用std :: queue,因为这是所需要的。如果你想删除/替换一些命令实例,你可以使用std :: list。如果你想阻塞一个空/满队列,不要忘记'条件变量'/ monitor/semaphore。 – stefaanv 2011-04-12 10:55:57

1

首先,我试图使用std :: list。但是有第一个问题:我不能列出抽象类。

可以,但是,创建包含指针到抽象基类,例如一个std::list

std::list<base_class *> commands; 

然后我试图使用boost :: ptr_list,但有第二个问题:课程,在第一个线程创建,dissappear议事的结束,创建它们。所以指针变得非法。

你的意思是新的命令是在第一个线程的堆栈上创建的吗?不要这样做 - 第一个线程不知道第二个线程何时完成处理命令,因此第一个线程不应该定义何时结束。只需让第一个线程使用new分配对象。

这就是说,你的用例听起来像生产者 - 消费者问题的典型例子。考虑看看the Wikipedia page,以获得关于如何正确实施这样一个系统的一些启发(这不是很难弄错)。