1

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

4

2 回答 2

1

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

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

于 2011-04-12T08:38:13.983 回答
1

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

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

std::list<base_class *> commands;

然后我尝试使用 boost::ptr_list,但出现了第二个问题:在第一个线程中创建的类在创建它们的过程结束时消失。所以指针变得非法。

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

话虽如此,您的用例听起来像是生产者-消费者问题的经典示例。考虑查看有关此的 Wikipedia 页面,以获取有关如何正确实施此类系统的一些灵感(弄错并不难)。

于 2011-04-12T08:44:54.223 回答