[英]Does move constructor makes any sense for a class that has std::thread's and std::mutex's as its fields?
[英]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
指定為不可移動的,這將使典型的生命周期變成這樣:在調用有價構造函數之后運行(與執行線程相關聯); 並在調用join
或detach
之后分離/加入(與執行線程無關)。 據我了解, std::vector<std::thread>
仍然可以使用,因為該類型應該是EmplaceConstructible
。
編輯:不正確! 該類型仍然需要是可移動的(畢竟在重新分配時)。 所以對我來說,這是足夠的理由:通常將std::thread
放入std::vector
和std::deque
等容器中,因此歡迎該類型的功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.