2011-04-12 102 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,以獲得關於如何正確實施這樣一個系統的一些啓發(這不是很難弄錯)。