亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++11如何實現(xiàn)無鎖隊列

 更新時間:2021年08月11日 15:35:17   作者:fzzjoy  
這篇文章主要介紹了C++11如何實現(xiàn)無鎖隊列,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

無鎖操作的本質依賴的原子操作,C++11提供了atomic的原子操作支持

atomic

compare_exchange_weak / compare_exchange_strong
當前值與期望值相等時,修改當前值為設定值,返回true
當前值與期望值不等時,將期望值修改為當前值,返回false

memory_order枚舉值

在這里插入圖片描述

template<typename T>
class lock_free_stack
{
private:
    struct node
    {
        T data;
        node* next;
        node(T const& data_):
        data(data_)
        {
        }
    };

    std::atomic<node*> head;

public:
    void push(T const& data)
    {
        node* const new_node=new node(data);
        new_node->next=head.load();  

        /*
        ** 當前值.compare_exchange_weak(期望值, 設置值)
        ** 單線程的情況:
        ** 第一次執(zhí)行while循環(huán):
        ** 此時當前值與期望值相等,修改當前值為設定值 head = new_node,返回true
        ** 多線程的情況:
        ** 第一次執(zhí)行循環(huán)體的時候:
        ** compare_exchange_weak如果失敗, 返回false, 證明有其他線程更新了棧頂head,
        ** 當前值與期望值不等時,將期望值修改為當前值, 即new_node->next等于新的棧頂head,
        ** 被其他線程更新的新棧頂值會被更新到new_node->next中,
        ** 因此循環(huán)可以直接再次嘗試壓棧而無需由程序員更新new_node->next。
        ** 然后第二次執(zhí)行循環(huán)體:
        ** 此時 head == new_node->next, 所以 head = new_node.
        ** 如果這是仍有其他線程干擾,則仍為循環(huán)更新new_node->next
        */
        while(!head.compare_exchange_weak(new_node->next,new_node));
    }
};

CAS原子操作

  • CAS即Compare and Swap,是所有CPU指令都支持CAS的原子操作(X86中CMPXCHG匯編指令),用于實現(xiàn)實現(xiàn)各種無鎖(lock free)數(shù)據(jù)結構。
  • CAS用于檢查一個內存位置是否包含預期值,如果包含,則把新值復賦值到內存位置。成功返回true,失敗返回false。

示例代碼如下:

bool compare_and_swap ( int *memory_location, int expected_value, int new_value)
{
    if (*memory_location == expected_value)
    {
        *memory_location = new_value;
        return true;
    }
    return false;
}

ABA問題

所謂ABA(見維基百科的ABA詞條),問題基本是這個樣子:

  • 進程P1在共享變量中讀到值為A
  • P1被搶占了,進程P2執(zhí)行
  • P2把共享變量里的值從A改成了B,再改回到A,此時被P1搶占。
  • P1回來看到共享變量里的值沒有被改變,于是繼續(xù)執(zhí)行。

雖然P1以為變量值沒有改變,繼續(xù)執(zhí)行了,但是這個會引發(fā)一些潛在的問題。ABA問題最容易發(fā)生在lock free 的算法中的,CAS首當其沖,因為CAS判斷的是指針的地址。如果這個地址被重用了呢,問題就很大了。(地址被重用是很經(jīng)常發(fā)生的,一個內存分配后釋放了,再分配,很有可能還是原來的地址)

eg:
好比你拿著一個裝滿錢的手提箱在飛機場,此時過來了一個火辣性感的美女,然后她很暖昧地挑逗著你,并趁你不注意的時候,把用一個一模一樣的手提箱和你那裝滿錢的箱子調了個包,然后就離開了,你看到你的手提箱還在那,于是就提著手提箱去趕飛機去了。

這就是ABA的問題。

Fetch-And-Add (FAA)

一般用來對變量做+1的原子操作

Test-And-Set (TAS)

寫值到某個內存位置并傳回其舊值

參考文章

C++11:原子交換函數(shù)compare_exchange_weak和compare_exchange_strong

到此這篇關于C++11如何實現(xiàn)無鎖隊列的文章就介紹到這了,更多相關C++11無鎖隊列內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++實現(xiàn)將輸入的內容輸出到文本文件

    C++實現(xiàn)將輸入的內容輸出到文本文件

    這篇文章主要介紹了C++實現(xiàn)將輸入的內容輸出到文本文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++基礎教程之指針拷貝詳解

    C++基礎教程之指針拷貝詳解

    這篇文章主要介紹了C++基礎教程之指針拷貝詳解的相關資料,需要的朋友可以參考下
    2017-01-01
  • Pthread?并發(fā)編程線程自底向上深入解析

    Pthread?并發(fā)編程線程自底向上深入解析

    這篇文章主要為大家介紹了Pthread?并發(fā)編程線程自底向上深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • C語言數(shù)據(jù)結構系列篇二叉樹的概念及滿二叉樹與完全二叉樹

    C語言數(shù)據(jù)結構系列篇二叉樹的概念及滿二叉樹與完全二叉樹

    在上一章中我們正式開啟了對數(shù)據(jù)結構中樹的講解,介紹了樹的基礎。本章我們將學習二叉樹的概念,介紹滿二叉樹和完全二叉樹的定義,并對二叉樹的基本性質進行一個簡單的介紹。本章附帶課后練習
    2022-02-02
  • C語言數(shù)據(jù)結構之算法的時間復雜度

    C語言數(shù)據(jù)結構之算法的時間復雜度

    這篇文章主要介紹了C語言數(shù)據(jù)結構之算法的時間復雜度,文章基于c語言的相關資料展開詳細介紹,具有一定的參價值,需要的小伙伴可以參考一下
    2022-05-05
  • C語言中的線程信號控制詳解

    C語言中的線程信號控制詳解

    這篇文章主要通過一些示例為大家詳細介紹一下C語言中的線程信號控制,文中的示例代碼講解詳細,對我們深入了解C語言有一定的幫助,感興趣的可以學習一下
    2023-02-02
  • C語言報錯Use of Uninitialized Variable的原因及解決方案

    C語言報錯Use of Uninitialized Variable的原因及解決方案

    Use of Uninitialized Variable是C語言中常見且危險的錯誤之一,它通常在程序試圖使用一個未初始化的變量時發(fā)生,本文將詳細介紹Use of Uninitialized Variable的產生原因,提供多種解決方案,并通過實例代碼演示如何有效避免和解決此類錯誤,需要的朋友可以參考下
    2024-06-06
  • C語言用fun函數(shù)實現(xiàn)兩個數(shù)的交換方式

    C語言用fun函數(shù)實現(xiàn)兩個數(shù)的交換方式

    這篇文章主要介紹了C語言用fun函數(shù)實現(xiàn)兩個數(shù)的交換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • C++實現(xiàn)與Lua相互調用的示例詳解

    C++實現(xiàn)與Lua相互調用的示例詳解

    這篇文章主要為大家詳細介紹了C++實現(xiàn)與Lua相互調用的方法,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解一下
    2023-03-03
  • C語言鏈表完整操作演示

    C語言鏈表完整操作演示

    這篇文章主要為大家詳細介紹了C語言鏈表的完整操作演示,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05

最新評論