2014-01-30 124 views
1

我有一個消費者 - 生產者的情況,我經常將數據推入列表中,如果它尚不存在,然後每隔幾秒我打包並將數據發送到服務器。如何使用std :: unique_ptr作爲std :: list變量

目前我有一個線程延遲了幾秒鐘,醒來,設置一個標誌,所以沒有任何東西被添加到列表中,打包,刪除從列表中處理的項目,然後允許程序開始再次添加到列表中。

這對原型來說很好,但現在我需要讓它在更現實的情況下更好地工作。

所以,我想讓生產者獲得信息,並且當尺寸足夠大或足夠長的時間將列表傳遞給要處理的線程。

我想將引用傳遞給列表,並且unique_ptr將會有所幫助,因此一旦它被移動,生產者線程就可以創建一個新列表,並且爲了所有實際目的,可以使用與之前相同的列表。

但是,當我試圖從

typedef list<string> STRINGQUEUE; 
STRINGQUEUE newMachineQueue; 

改變我的名單

std::unique_ptr<STRINGQUEUE> newMachineQueue; 

然後我得到的錯誤,insert不是std::unique_ptr成員。

我不認爲我想用newMachineQueue.get()然後做我的手術,因爲我相信我失去了unique_ptr的好處。

那麼,如何在列表中使用unique_ptr並能夠調用列表中的方法呢?

回答

2

只要像使用指針一樣使用它即可。

newMachineQueue->insert(...); 

您可能會感興趣in the documentation

您也不需要使用unique_ptr,但您可以移動列表並重新分配一個新列表。

void consumer(std::list<string> list) { 
    // accept by value! 
} 

std::list<string> machineQueue; 
// hand-off to consumer 
consumer(std::move(machineQueue)); 
machineQueue = std::list<string>{}; // new list 
+0

哎呀,謝謝。我使用newMachineQueue.insert,因爲我忘了它當前不是指針。 –

+1

@JamesBlack我還添加了一些代碼,可以在不使用'unique_ptr'的情況下執行所需的操作。 – pmr

+0

您的編輯解決了另一個問題,我準備問一下,因爲在嘗試使用unique_ptr調用線程時出現奇怪的錯誤。 Thanx –

相關問題