2016-07-06 41 views
2

爲什麼condition_variable不是MoveConstructible(按照http://en.cppreference.com/w/cpp/thread/condition_variable)?這禁止包含在大量移動東西的容器中(例如std::unordered_map)。爲什麼一個condition_variable不是MoveAssignable

這迫使人們使用一個unique_ptr這引起了一個額外的堆分配,其中像make_shared這樣的東西是建立來解決。此外,如果沒有池分配器,這可能變得非常低效。

+0

可能讓線程安全太麻煩。您不希望在移動變量期間發生通知。 – NathanOliver

+0

@NathanOliver反正'condition_variable'線程的接口中的所有函數都不安全嗎?我只是想着爲什麼這應該是一個問題 – Curious

+0

我認爲這只是沒有任何意義。考慮一個條件變量處於等待狀態並且另一個線程複製它的情況。複製的條件變量的狀態應該是什麼?如果你說它應該像它的默認構建狀態那麼再次複製真的沒有意義。此外,它取決於是否允許在不調用UB的情況下複製本地條件變量結構(用於'std :: condition_variable')是否允許複製'pthread_cond_t'。 – Arunmu

回答

4

condition_variable是多線程(可能)同時使用的同步構造。 (事實上​​,這是它的目的。)你怎麼能安全地移動它?例如,假設它直接包含自旋鎖。一些線程正在您的進程地址空間中的給定地址上旋轉,並且您將要將對象從其下移出?

任何種類的用戶模式同步構造都不能移動。實際同步需要固定地址。你可以強制這個對象在一個不會被移動的堆分配對象上完成它所有的實際工作 - 並且你直接去間接尋找你想要避免的堆。 (內核模式同步結構可以移動:你有一些操作系統的東西,但是它們的價格要高得多使用。)

它們不能被複制 - 因爲那會是什麼意思?

它只是這樣。你的設計必須解釋它,就是這樣。

(我並不真正理解你的問題的第二段,make_shared是爲了讓ref計數更便宜而且沒有任何與移動東西有關的東西。池分配器可能會也可能不會提高特別的情況,更不用說這個了,除非你測量它,否則你就不會知道。)

相關問題