最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

atomic

compare_exchange_weak / compare_exchange_strong
當(dāng)前值與期望值相等時,修改當(dāng)前值為設(shè)定值,返回true
當(dāng)前值與期望值不等時,將期望值修改為當(dāng)前值,返回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();  

        /*
        ** 當(dāng)前值.compare_exchange_weak(期望值, 設(shè)置值)
        ** 單線程的情況:
        ** 第一次執(zhí)行while循環(huán):
        ** 此時當(dāng)前值與期望值相等,修改當(dāng)前值為設(shè)定值 head = new_node,返回true
        ** 多線程的情況:
        ** 第一次執(zhí)行循環(huán)體的時候:
        ** compare_exchange_weak如果失敗, 返回false, 證明有其他線程更新了棧頂head,
        ** 當(dāng)前值與期望值不等時,將期望值修改為當(dāng)前值, 即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匯編指令),用于實(shí)現(xiàn)實(shí)現(xiàn)各種無鎖(lock free)數(shù)據(jù)結(jié)構(gòu)。
  • CAS用于檢查一個內(nèi)存位置是否包含預(yù)期值,如果包含,則把新值復(fù)賦值到內(nèi)存位置。成功返回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詞條),問題基本是這個樣子:

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

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

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

這就是ABA的問題。

Fetch-And-Add (FAA)

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

Test-And-Set (TAS)

寫值到某個內(nèi)存位置并傳回其舊值

參考文章

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

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

相關(guān)文章

  • C語言修煉之路函數(shù)篇真題訓(xùn)練上

    C語言修煉之路函數(shù)篇真題訓(xùn)練上

    函數(shù)是一組一起執(zhí)行一個任務(wù)的語句。每個?C?程序都至少有一個函數(shù),即主函數(shù)?main()?,所有簡單的程序都可以定義其他額外的函數(shù)
    2022-03-03
  • C++編程中的函數(shù)指針初步解析

    C++編程中的函數(shù)指針初步解析

    這篇文章主要介紹了C++編程中的函數(shù)指針初步解析,函數(shù)指針在C語言和C++學(xué)習(xí)中都是非常重要的知識,需要的朋友可以參考下
    2016-04-04
  • 整理C語言中各種類型指針的特性與用法

    整理C語言中各種類型指針的特性與用法

    這篇文章主要介紹了C語言中各種類型指針的特性與用法整理,需要的朋友可以參考下
    2016-04-04
  • 快速了解C語言靜態(tài)關(guān)鍵字static的作用

    快速了解C語言靜態(tài)關(guān)鍵字static的作用

    這篇文章主要介紹了C語言中靜態(tài)關(guān)鍵字static的作用,對大家學(xué)習(xí)C語言非常有幫助,有需求的小伙伴可以參考下
    2020-05-05
  • C++ 深入淺出探索模板

    C++ 深入淺出探索模板

    人們需要編寫多個形式和功能都相似的函數(shù),因此有了函數(shù)模板來減少重復(fù)勞動;人們也需要編寫多個形式和功能都相似的類,于是 C++ 引人了類模板的概念,編譯器從類模板可以自動生成多個類,避免了程序員的重復(fù)勞動
    2022-04-04
  • C++ Boost Coroutine使用協(xié)程詳解

    C++ Boost Coroutine使用協(xié)程詳解

    通過Boost.Coroutine,可以在C++中使用協(xié)程。協(xié)程是其他編程語言的一個特性,通常使用關(guān)鍵字yield來表示協(xié)程。在這些編程語言中,yield可以像return一樣使用
    2022-11-11
  • C/C++迭代器的失效問題詳解

    C/C++迭代器的失效問題詳解

    這篇文章主要為大家詳細(xì)介紹了C/C++迭代器的失效問題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • TensorFlow源代碼構(gòu)建流程記錄解析

    TensorFlow源代碼構(gòu)建流程記錄解析

    這篇文章主要為大家介紹了TensorFlow源代碼構(gòu)建流程記錄解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 一文詳解Qt如何優(yōu)雅的進(jìn)行界面布局

    一文詳解Qt如何優(yōu)雅的進(jìn)行界面布局

    使? Qt 在界?上創(chuàng)建的控件, 都是通過 “絕對定位” 的?式來設(shè)定的,這種設(shè)定?式其實(shí)并不?便,尤其是界?如果內(nèi)容?較多, 不好計(jì)算,所以Qt 引??布局管理器 (Layout)?機(jī)制, 來解決上述問題,需要的朋友可以參考下
    2024-05-05
  • C++ 系統(tǒng)String類詳解

    C++ 系統(tǒng)String類詳解

    這篇文章主要介紹了C++的系統(tǒng)String類,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-11-11

最新評論

凤山市| 彭州市| 通辽市| 古浪县| 休宁县| 山东省| 赫章县| 肃宁县| 朝阳市| 平远县| 黄大仙区| 达日县| 阳原县| 正安县| 新平| 留坝县| 孝昌县| 南平市| 广水市| 竹山县| 临沭县| 合阳县| 安平县| 中超| 贵溪市| 凤台县| 海城市| 桦甸市| 灯塔市| 海原县| 恩施市| 江都市| 玉门市| 清丰县| 历史| 万盛区| 法库县| 历史| 西畴县| 东方市| 江山市|