亲爱的C++专业人士。我遇到了问题。我有一个程序,它有1个抽象类base_class和2个派生类:sippeers和dbget。它也有2个线程。第一个线程从用户处获得命令,第二个线程处理这些命令。两个派生类都代表不同的命令。所以,我必须创建某种堆栈,我应该在第一个线程中放置用户命令,并在第二个线程中处理它们。为了为所有命令创建一个堆栈,我必须使用多态。首先,我试图使用std :: list。但是有第一个问题:我不能列出抽象类。然后我尝试使用boost :: ptr_list,但还有第二个问题:在第一个线程中创建的类随着过程结束而消失,创建它们。所以指针变得非法。问题:我应该使用什么样的实现?看起来我必须存储派生类的每个副本。但是哪里?堆栈的polymorphed类
1
A
回答
1
shared_ptr<base_class>
的std ::队列是将类从1个线程传递到另一个线程的最直接的解决方案,无需担心内存管理问题。结合一个条件变量来表明队列不是空的,所以消费者线程可以等待。
对于多态性部分,有一个额外的虚函数(execute()?),所以消费线程不应该知道它实际接收了什么类。
1
首先,我试图使用std :: list。但是有第一个问题:我不能列出抽象类。
可以,但是,创建包含指针到抽象基类,例如一个std::list
std::list<base_class *> commands;
然后我试图使用boost :: ptr_list,但有第二个问题:课程,在第一个线程创建,dissappear议事的结束,创建它们。所以指针变得非法。
你的意思是新的命令是在第一个线程的堆栈上创建的吗?不要这样做 - 第一个线程不知道第二个线程何时完成处理命令,因此第一个线程不应该定义何时结束。只需让第一个线程使用new
分配对象。
这就是说,你的用例听起来像生产者 - 消费者问题的典型例子。考虑看看the Wikipedia page,以获得关于如何正确实施这样一个系统的一些启发(这不是很难弄错)。
相关问题
- 1. TinyMCE堆栈类
- 2. 堆栈VS堆带类
- 3. 堆栈使用类
- 4. 堆/堆栈上的类成员分配?
- 5. 使用polymorphed子类的相应方法
- 6. JVM - 堆栈和堆栈
- 7. 希望堆栈堆栈?
- 8. 堆栈或堆
- 9. 堆栈= java.lang.StackOverflowError的:堆栈大小8MB
- 10. 字符堆栈,字符串堆栈,整数堆栈,整数数组堆栈等
- 11. 堆栈
- 12. 堆栈
- 13. 从堆栈导航到CDB/WinDbg中的托管堆栈中的堆栈帧
- 14. 堆栈搜索导致堆栈溢出
- 15. getaddrinfo addrinfo导致堆栈或堆栈
- 16. Python堆栈为堆栈格式
- 17. 堆栈帧和堆栈指针
- 18. 堆栈或堆栈分配不正确
- 19. Haskell中的一般'无类型'堆栈
- 20. 堆栈的大小和值类型
- 21. Java和不同类型的堆栈
- 22. 有许多不同类型的堆栈
- 23. 如何使我的堆栈类动态
- 24. 什么是基于堆栈的类?
- 25. Eclipse的类型层次堆栈溢出
- 26. 中的NSNumber堆栈
- 27. 堆栈中的Android
- 28. 什么“堆栈无效,堆栈只支持堆栈1和堆栈5”是什么意思?
- 29. 类的字段,它们是存储在堆栈还是堆?
- 30. 在堆栈或堆上创建的类成员?
它是解决方案吗?我可以用 的std ::列表<提高:: shared_ptr的>命令 第一个线程可以把指针进入这个名单,第二个线程可以这样做: 而 { base_command C =命令(commands.empty()!) 。面前(); commands.pop_front(); } –
CagoBHuK
2011-04-12 10:06:17
除了shared_ptrs(我们当时不知道),这是我们使用的(简化的)解决方案。我们使用std :: queue,因为这是所需要的。如果你想删除/替换一些命令实例,你可以使用std :: list。如果你想阻塞一个空/满队列,不要忘记'条件变量'/ monitor/semaphore。 – stefaanv 2011-04-12 10:55:57