簡體   English   中英

移動std :: mutex的構造函數

[英]Move constructor for std::mutex

現在,c ++標准庫中的許多類都具有move構造函數,例如-

thread::thread(thread&& t)

但是似乎std :: mutex沒有。 我知道不能復制它們,但是例如能夠從“ make_mutex”函數返回一個值似乎很有意義。 (不是說它有用,只是說它有意義)

有什么原因為什么std :: mutex沒有移動構造函數?

好吧...主要是因為我不認為他們應該搬家 從字面上看。

在某些OS-es中,互斥鎖可能被建模為句柄(以便您可以復制它們),但是IIRC會在適當位置操縱pthreads互斥鎖。 如果要重新定位該線程,則任何線程安全性都將直接從窗口飛出(其他線程如何知道互斥體剛剛更改了它的內存地址...)?

請記住,C ++秉承“不為您不使用的東西付錢”的理念。 例如,考慮一個使用不透明類型表示互斥量的假想平台; 我們稱其為mutex_t類型。 如果要在該互斥mutex_t*進行操作的接口使用mutex_t*作為參數,例如void mutex_init(mutex_t* mutex); 要“構造”互斥鎖,很可能互斥鎖的地址就是用來唯一標識互斥鎖的情況。 如果是這種情況,則意味着mutex_t是不可復制的:

mutex_t kaboom()
{
    mutex_t mutex;
    mutex_init(&mutex);
    return mutex; // disaster
}

執行mutex_t mutex = kaboom();此處無法保證mutex_t mutex = kaboom(); &mutex &mutex功能塊中的&mutex值相同。

當實現者想要為該平台編寫std::mutex的日子到來時,如果要求該類型是可移動的,那么這意味着內部mutex_t必須放置在動態分配的內存中,並附帶所有相關的罰款。

另一方面,雖然現在std::mutex 不可移動,但是很容易從函數中“返回”一個:返回一個std::unique_ptr<std::mutex> 這仍然付出了動態分配的成本, 但只需要一個位置 所有不需要移動std::mutex的其他代碼都不必為此付出代價。

換句話說,由於移動互斥鎖並不是互斥鎖的核心操作,因此不需要std::mutex可移動並不會刪除任何功能(由於不可移動 T => 可移動 std::unique_ptr<T>與直接使用本機類型相比, std::unique_ptr<T>轉換)將產生最低的開銷成本。


可以類似地將std::thread指定為不可移動的,這將使典型的生命周期變成這樣:在調用有價構造函數之后運行(與執行線程相關聯); 並在調用joindetach之后分離/加入(與執行線程無關)。 據我了解, std::vector<std::thread>仍然可以使用,因為該類型應該是EmplaceConstructible

編輯:不正確! 該類型仍然需要是可移動的(畢竟在重新分配時)。 所以對我來說,這是足夠的理由:通常將std::thread放入std::vectorstd::deque等容器中,因此歡迎該類型的功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM