《C++ Concurrency in Action》筆記7 mutex(3)pop和top問題之方案

接着上一篇筆記,如何解決,top、pop問題。

方案一

讓pop()以參數的形式返回一個引用。

std::vector<int> result;
some_stack.pop(result);

這種方案在大多數情況下都能正常工作。但是它有個嚴重的缺點,就是需要再調用pop前先構造一個值的實例。有時,這是不切實際的,因爲這需要花費時間或資源。另一方面,這也不總是可行的,因爲構造一個示例所需的參數在某個時間點有可能是無效的。最後,他要求實例類型是可賦值的,很多自定義類型並不支持賦值操作,

方案二

採用返回值拷貝的pop接口。並且保證stack中值類型保證在copy或move時不拋出異常。儘管可以通過std::is_nothrow_copy_constructible和std::is_nothrow_move_constructible來判斷拷貝構造和移動構造函數是否拋出異常,但是那很有限。有很多自定義類型並不能保證這點。

方案三

採用返回指針的pop接口。優點是,可以輕鬆的拷貝一個指針,並且沒有異常拋出。缺點是,需要一系列內存管理操作,對於簡單的類型比如int,其開銷甚至超過返回一個值拷貝。對於使用這種操作的接口,std::shared_ptr是一個不錯的選擇,既能避免使用new和delete,又能防止內存泄漏。但是,使用這種策略就要求stack中使用new申請內存,與方案二相比這將需要相當大的開銷。

方案四

同時採用方案一和方案二(或者方案三)。如果你已經提供了方案二或者方案三,那麼再增加方案一接口是很容易的事。這樣,在使用時可以根據實際情況靈活運用。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章