我經常閱讀我應該通過一個函數const引用shared_ptr,因爲它更快。當我想到它時,我不確定這是否是一個好的建議,因爲我不確定這是否是線程化的。任何人都可以告訴我,如果這將是通過const ref傳遞的線程嗎?它通過const引用傳遞shared_pointer線程嗎?
回答
你應該更喜歡通過const&
來避免任何類的副本的開銷。例如,這對於像std::string
這樣的東西特別重要。
在通過shared_ptr
const&
的情況下,開銷主要是incrementing and decrementing of the reference count,因爲它是原子的。
但是!與const& shared_ptr
創建線程時有一個問題:引用計數將遞增。既然它增加了,就好像你已經通過價值傳遞了它。你實際上是通過價值傳遞到std::thread
ctor,從而增加,然後通過ref傳遞給函數。
見自己:
// gcc (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4
void test(const shared_ptr<int>& i)
{
cout << "c = " << i.use_count() << endl;
}
int main(int argc, char** argv)
{
shared_ptr<int> i(new int);
cout << "c = " << i.use_count() << endl;
test(i);
cout << "thread!" << endl;
thread t(test, i);
t.join();
cout << "c = " << i.use_count() << endl;
}
結果之中:
c = 1
c = 1
thread!
c = 2 // <= incremented!
c = 1 // <= thread joined!
shared_ptr
是線程安全的一個完美的候選人,但它不會保護你的比賽條件和死鎖。
With a &
you get the object itself。
你沒有增加參考數量,你只是通過它自己的對象。人們建議通過const&
的原因是爲了避免線程安全增加參考計數的成本。作爲const&
傳遞的代價與複製int或指針的代價相同,並且沒有臨時對象將被綁定到const&
,因爲shared_ptr
的構造函數標記爲explicit
。
而且由於您始終至少有一個對象引用(引用與被調用函數綁定的對象),所以不用擔心在使用本地引用時對象可能會被破壞。
如果引用綁定的對象超出範圍會發生什麼?它不會被破壞,因爲refcount然後是0.如果這會發生,我會使用內存,如果我使用ref – Exagon
傳遞一個'const&'與一個普通'&'不同?兩者都只是參考,所以不應引用計數更改。 – rozina
@Exagon,它是如何超出範圍的?你調用了傳遞本地'shared_ptr'的函數。它至少不能超出範圍,直到你從該函數返回並且直到當前塊'shared_ptr'到達結尾。例如'{std :: shared_ptr
傳遞const引用是線程無關的。看看下面簡單的代碼:
void foo(const std::shared_ptr<int>& x) {
sleep(100000);
}
void bar() {
//...
std::shared_ptr y = ...;
foo(y);
}
y
想要住在酒吧,直到foo
回報 - 從而確保shared_ptr
仍然有效。如果foo()
要創建另一個線程並將x
傳遞給它,它將不得不復制它 - 這將增加引用計數器。
通過引用傳遞總是線程安全的,無論哪個對象被傳遞。如果它是對const的引用,它是無關緊要的。
- 1. 通過引用傳遞const值的C++
- 2. 通過const引用傳遞Qt類
- 3. 通過const引用傳遞的C++
- 4. 通過引用傳遞TCL - 線程?
- 5. 通過引用線程傳遞對象
- 6. 通過值或通過引用const傳遞std :: chrono :: duration?
- 7. 是否更好地通過引用對非const傳遞引用進行const傳遞?
- 8. 通過const引用傳遞一個對象?
- 9. 通過const引用複製傳遞C++對象構造函數
- 10. C++通過Const引用並通過Const返回引用
- 11. 通過引用傳遞與值傳遞
- 12. 通過引用傳遞C++
- 13. C++通過引用傳遞?
- 14. cpp通過引用傳遞
- 15. PHP通過引用傳遞?
- 16. Java通過引用傳遞
- 17. C++通過引用傳遞
- 18. 通過引用傳遞流
- 19. JFrame通過引用傳遞
- 20. 通過引用傳遞LPCWSTR
- 21. Java通過引用傳遞
- 22. 通過引用傳遞整數與線程
- 23. 嘗試引用與const成員通過引用傳遞時刪除的函數
- 24. 通過引用傳遞引用?
- 25. 通過類的const引用
- 26. Java是通過值傳遞還是通過引用傳遞?
- 27. 通過引用傳遞和遞歸
- 28. 爲什麼它可以通過const引用傳遞R值而不是正常引用?
- 29. 通過引用傳遞通道隱含
- 30. 引用問題傳遞const對象
'std :: thread'構造函數複製/移動所有參數。 – GeorgeAl
@GeorgeAl Thx,補充說,精度 – BlakBat