मैं एंटनी विलियम्स द्वारा following लेख को पढ़ने के और जैसा कि मैंने अलावा std::shared_ptr
में परमाणु साझा गिनती के लिए std::experimental::atomic_shared_ptr
में वास्तविक सूचक साझा वस्तु समझा भी परमाणु है?std :: shared_ptr और std :: experimental :: atomic_shared_ptr के बीच क्या अंतर है?
लेकिन जब मैं lock_free_stack
एंटनी की पुस्तक में वर्णित के संदर्भ में गिना संस्करण के बारे में पढ़ा के बारे में C++ Concurrency यह मेरे लिए लगता है कि यह भी std::shared_ptr
के लिए एक ही aplies, क्योंकि कार्यों std::atomic_load
की तरह, std::atomic_compare_exchnage_weak
std::shared_ptr
के उदाहरण के लिए लागू कर रहे हैं।
template <class T>
class lock_free_stack
{
public:
void push(const T& data)
{
const std::shared_ptr<node> new_node = std::make_shared<node>(data);
new_node->next = std::atomic_load(&head_);
while (!std::atomic_compare_exchange_weak(&head_, &new_node->next, new_node));
}
std::shared_ptr<T> pop()
{
std::shared_ptr<node> old_head = std::atomic_load(&head_);
while(old_head &&
!std::atomic_compare_exchange_weak(&head_, &old_head, old_head->next));
return old_head ? old_head->data : std::shared_ptr<T>();
}
private:
struct node
{
std::shared_ptr<T> data;
std::shared_ptr<node> next;
node(const T& data_) : data(std::make_shared<T>(data_)) {}
};
private:
std::shared_ptr<node> head_;
};
स्मार्ट संकेत के इस दो प्रकार के बीच सटीक अंतर क्या है, और अगर std::shared_ptr
उदाहरण में सूचक परमाणु नहीं है, कारण है कि यह ऊपर ताला मुक्त ढेर कार्यान्वयन संभव है?
यह लॉक मुक्त नहीं है। 'Atomic_ *' के विशिष्ट कार्यान्वयन म्यूटेक्स की वैश्विक सरणी का उपयोग करते हैं। –