簡體   English   中英

C ++智能指針是否無鎖?

[英]Are C++ smart pointers lockfree?

對於std::unique_ptr和/或std::shared_ptr ,以下操作是否無鎖定?

  1. read(*myPtr)引用,即read(*myPtr)myPtr->getSomething()
  2. 刪除引用,即使用std::move(myUniquePtr)std::shared_ptr超出范圍。

就我而言,我不會同時從多個線程訪問這些指針。 我只是好奇我是否可以在高優先級,無鎖線程上專門使用它們。 由指針管理的對象在高優先級回調之前由主線程分配,並且在回調停止之前不會被釋放。

謝謝!

通過合理的實施,您可以假設:

std :: unique_ptr

  • std :: unique_ptr上的所有操作都與原始指針上的相應操作一樣無鎖,因為並發性沒有什么特別之處。

std :: shared_ptr

  • 所有不更改引用計數的操作都與原始指針上的相應操作一樣無鎖。 這包括解除引用移動構造的操作。
  • std :: move是無鎖的,因為它只是對rvalue-reference的強制轉換。
  • std :: shared_ptr的析構函數至少與std::atomic<std::size_t>一樣無鎖(可以使用成員函數is_lock_free進行檢查)。
  • 移動賦值取決於左側的std :: shared_ptr是否具有關聯的托管對象。 如果存在關聯的托管對象,則它與析構函數一樣無鎖。 否則它與移動構造函數一樣無鎖,因為引用計數不會更改。

標准所說的就是shared_ptr<> (20.7.2.2/4“類模板shared_ptr”):

use_count()更改不反映可能引入數據use_count()修改

它沒有說use_count()中的那些更改必須是無鎖的。 該標准允許使用互斥鎖來防止數據競爭。

unique_ptr<>沒有承諾阻止數據爭用(它本身並不打算是線程安全的)。

暫無
暫無

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

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