親愛的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. Java,堆棧類
- 2. TinyMCE堆棧類
- 3. 堆棧VS堆帶類
- 4. 繼承堆棧類
- 5. 堆棧使用類
- 6. 使用polymorphed子類的相應方法
- 7. 堆/堆棧上的類成員分配?
- 8. Python的導入類堆棧
- 9. JVM - 堆棧和堆棧
- 10. 希望堆棧堆棧?
- 11. 類Python和開發堆棧
- 12. 堆棧或堆
- 13. 堆棧= java.lang.StackOverflowError的:堆棧大小8MB
- 14. 中斷堆棧的堆棧指針
- 15. 字符堆棧,字符串堆棧,整數堆棧,整數數組堆棧等
- 16. 瞭解堆棧(數據結構),堆棧類,鏈表 - java?
- 17. 全堆棧,堆棧交換等,什麼是堆棧?
- 18. 堆棧
- 19. 堆棧
- 20. 堆棧
- 21. Eclipse的堆棧
- 22. OOP和堆/堆棧
- 23. 塊,堆棧和堆
- 24. 從堆棧導航到CDB/WinDbg中的託管堆棧中的堆棧幀
- 25. 堆棧,堆棧泛化算法
- 26. 矢量,堆棧與堆棧(C++)
- 27. cin是堆棧還是堆棧?
- 28. 堆棧在java中使用堆棧
- 29. 堆棧幀和堆棧指針
- 30. 堆棧溢出調用堆棧#timememoryfunctionlocation 10.0000143728
它是解決方案嗎?我可以用 的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