青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

loop_in_codes

低調做技術__歡迎移步我的獨立博客 codemaro.com 微博 kevinlynx

并行編程中的內存回收Hazard Pointer

接上篇使用RCU技術實現(xiàn)讀寫線程無鎖,在沒有GC機制的語言中,要實現(xiàn)Lock free的算法,就免不了要自己處理內存回收的問題。

Hazard Pointer是另一種處理這個問題的算法,而且相比起來不但簡單,功能也很強大。鎖無關的數(shù)據(jù)結構與Hazard指針中講得很好,Wikipedia Hazard pointer也描述得比較清楚,所以我這里就不講那么細了。

一個簡單的實現(xiàn)可以參考我的github haz_ptr.c

原理

基本原理無非也是讀線程對指針進行標識,指針(指向的內存)要釋放時都會緩存起來延遲到確認沒有讀線程了才對其真正釋放。

<Lock-Free Data Structures with Hazard Pointers>中的描述:

Each reader thread owns a single-writer/multi-reader shared pointer called “hazard pointer.” When a reader thread assigns the address of a map to its hazard pointer, it is basically announcing to other threads (writers), “I am reading this map. You can replace it if you want, but don’t change its contents and certainly keep your deleteing hands off it.”

關鍵的結構包括:Hazard pointerThread Free list

Hazard pointer:一個讀線程要使用一個指針時,就會創(chuàng)建一個Hazard pointer包裝這個指針。一個Hazard pointer會被一個線程寫,多個線程讀。

struct HazardPointer {
        void *real_ptr; // 包裝的指針
        ... // 不同的實現(xiàn)有不同的成員
    };

    void func() {
        HazardPointer *hp = accquire(_real_ptr);
        ... // use _real_ptr
        release(hp);
    }

Thread Free List:每個線程都有一個這樣的列表,保存著將要釋放的指針列表,這個列表僅對應的線程讀寫

void defer_free(void *ptr) {
        _free_list.push_back(ptr);
    }

當某個線程要嘗試釋放Free List中的指針時,例如指針ptr,就檢查所有其他線程使用的Hazard pointer,檢查是否存在包裝了ptr的Hazard pointer,如果沒有則說明沒有讀線程正在使用ptr,可以安全釋放ptr

void gc() {
        for(ptr in _free_list) {
            conflict = false
            for (hp in _all_hazard_pointers) {
                if (hp->_real_ptr == ptr) {
                    confilict = true
                    break
                }
            }
            if (!conflict)
                delete ptr
        }
    }

以上,其實就是Hazard Pointer的主要內容。

Hazard Pointer的管理

上面的代碼中沒有提到_all_hazard_pointersaccquire的具體實現(xiàn),這就是Hazard Pointer的管理問題。

《鎖無關的數(shù)據(jù)結構與Hazard指針》文中創(chuàng)建了一個Lock free的鏈表來表示這個全局的Hazard Pointer List。每個Hazard Pointer有一個成員標識其是否可用。這個List中也就保存了已經被使用的Hazard Pointer集合和未被使用的Hazard Pointer集合,當所有Hazard Pointer都被使用時,就會新分配一個加進這個List。當讀線程不使用指針時,需要歸還Hazard Pointer,直接設置可用成員標識即可。要gc()時,就直接遍歷這個List。

要實現(xiàn)一個Lock free的鏈表,并且僅需要實現(xiàn)頭插入,還是非常簡單的。本身Hazard Pointer標識某個指針時,都是用了后立即標識,所以這個實現(xiàn)直接支持了動態(tài)線程,支持線程的掛起等。

nbds項目中也有一個Hazard Pointer的實現(xiàn),相對要弱一點。它為每個線程都設置了自己的Hazard Pointer池,寫線程要釋放指針時,就訪問所有其他線程的Hazard Pointer池。

typedef struct haz_local {
        // Free List
        pending_t *pending; // to be freed
        int pending_size;
        int pending_count;

        // Hazard Pointer 池,動態(tài)和靜態(tài)兩種
        haz_t static_haz[STATIC_HAZ_PER_THREAD];

        haz_t **dynamic;
        int dynamic_size;
        int dynamic_count;

    } __attribute__ ((aligned(CACHE_LINE_SIZE))) haz_local_t;

    static haz_local_t haz_local_[MAX_NUM_THREADS] = {};

每個線程當然就涉及到haz_local_索引(ID)的分配,就像使用RCU技術實現(xiàn)讀寫線程無鎖中的一樣。這個實現(xiàn)為了支持線程動態(tài)創(chuàng)建,就需要一套線程ID的重用機制,相對復雜多了。

附錄

最后,附上一些并行編程中的一些概念。

Lock Free & Wait Free

常常看到Lock FreeWait Free的概念,這些概念用于衡量一個系統(tǒng)或者說一段代碼的并行級別,并行級別可參考并行編程——并發(fā)級別。總之Wait Free是一個比Lock Free更牛逼的級別。

我自己的理解,例如《鎖無關的數(shù)據(jù)結構與Hazard指針》中實現(xiàn)的Hazard Pointer鏈表就可以說是Lock Free的,注意它在插入新元素到鏈表頭時,因為使用CAS,總免不了一個busy loop,有這個特征的情況下就算是Lock Free,雖然沒鎖,但某個線程的執(zhí)行情況也受其他線程的影響。

相對而言,Wait Free則是每個線程的執(zhí)行都是獨立的,例如《鎖無關的數(shù)據(jù)結構與Hazard指針》中的Scan函數(shù)。“每個線程的執(zhí)行時間都不依賴于其它任何線程的行為”

鎖無關(Lock-Free)意味著系統(tǒng)中總存在某個線程能夠得以繼續(xù)執(zhí)行;而等待無關(Wait-Free)則是一個更強的條件,它意味著所有線程都能往下進行。

ABA問題

在實現(xiàn)Lock Free算法的過程中,總是要使用CAS原語的,而CAS就會帶來ABA問題。

在進行CAS操作的時候,因為在更改V之前,CAS主要詢問“V的值是否仍然為A”,所以在第一次讀取V之后以及對V執(zhí)行CAS操作之前,如果將值從A改為B,然后再改回A,會使基于CAS的算法混亂。在這種情況下,CAS操作會成功。這類問題稱為ABA問題。

Wiki Hazard Pointer提到了一個ABA問題的好例子:在一個Lock free的棧實現(xiàn)中,現(xiàn)在要出棧,棧里的元素是[A, B, C]head指向棧頂,那么就有compare_and_swap(target=&head, newvalue=B, expected=A)。但是在這個操作中,其他線程把A B都出棧,且刪除了B,又把A壓入棧中,即[A, C]。那么前一個線程的compare_and_swap能夠成功,此時head指向了一個已經被刪除的B。stackoverflow上也有個例子 Real-world examples for ABA in multithreading

對于CAS產生的這個ABA問題,通常的解決方案是采用CAS的一個變種DCAS。DCAS,是對于每一個V增加一個引用的表示修改次數(shù)的標記符。對于每個V,如果引用修改了一次,這個計數(shù)器就加1。然后再這個變量需要update的時候,就同時檢查變量的值和計數(shù)器的值。

但也早有人提出DCAS也不是ABA problem 的銀彈

posted on 2015-05-03 20:46 Kevin Lynx 閱讀(20054) 評論(0)  編輯 收藏 引用 所屬分類: c/c++

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品永久免费观看| 美女福利精品视频| 一区二区国产精品| 亚洲人成网站在线播| 久久久久久久久久久久久久一区| 精品91在线| 18成人免费观看视频| 国产一区二区三区四区五区美女 | 亚洲精品国产精品国自产观看浪潮| 国产精品免费福利| 国产精品夜色7777狼人| 国产精品video| 国产精品久久久久三级| 国产亚洲精品资源在线26u| 国产欧美精品一区aⅴ影院| 国产婷婷精品| 亚洲国产一区在线| 香港久久久电影| 欧美国产精品中文字幕| 最新中文字幕亚洲| 亚洲人成绝费网站色www| 亚洲欧美另类综合偷拍| 久久久久久尹人网香蕉| 国产精品午夜久久| 99视频精品全国免费| 久久一综合视频| 一本久久a久久精品亚洲| 久久综合九九| 狠狠色丁香久久婷婷综合丁香 | 国语精品中文字幕| 一区二区精品国产| 久久视频精品在线| 欧美一区二区三区免费大片| 欧美有码在线视频| 中日韩男男gay无套| 久久久精品日韩欧美| 国产精品天美传媒入口| 最新国产精品拍自在线播放| 快射av在线播放一区| 久久久久久综合| 亚洲国产三级| 亚洲精品一区二区三区福利| 久久久水蜜桃| av成人免费| 亚洲一区二区免费视频| 国产亚洲欧美日韩精品| 欧美主播一区二区三区| 午夜亚洲视频| 亚洲精品美女久久久久| 一本久道综合久久精品| 国产精品尤物福利片在线观看| 久久最新视频| 国产精品每日更新| 欧美激情国产精品| 亚洲一区二区av电影| 久久久久久综合| 欧美一级欧美一级在线播放| 久久手机免费观看| 欧美与欧洲交xxxx免费观看| 久久综合色播五月| 欧美在线免费看| 国产精品普通话对白| 你懂的视频一区二区| 国产欧美日韩亚洲精品| 欧美成人国产一区二区| 国内精品久久久久久| 一本久久知道综合久久| 亚洲国产视频一区二区| 欧美一区二区三区的| 欧美国产一区二区在线观看| 久久超碰97人人做人人爱| 欧美精品成人一区二区在线观看 | 久久国产精品一区二区三区| 久久一区视频| 欧美激情一区二区三区蜜桃视频 | 亚洲少妇在线| 亚洲一区免费网站| 欧美性大战久久久久久久| 亚洲九九爱视频| 日韩天堂在线视频| 欧美日韩在线一二三| 99在线|亚洲一区二区| 亚洲女ⅴideoshd黑人| 国产精品久久一级| 久久精品在线| 日韩视频不卡| 欧美资源在线| 亚洲国产日韩在线| 国产精品国码视频| 欧美一区二区三区日韩| 欧美一区二区精品久久911| 国产一区二区中文| 欧美99在线视频观看| 亚洲日本久久| 久久精品国产v日韩v亚洲| 伊人男人综合视频网| 亚洲欧美精品suv| 亚洲精品久久久久中文字幕欢迎你| 国产精品成人免费| 欧美一区二区在线| 亚洲欧美精品在线观看| 欧美成人蜜桃| 国产麻豆日韩| 欧美剧在线免费观看网站| 欧美亚洲一区三区| 亚洲综合色丁香婷婷六月图片| 久久久一二三| 久久久免费观看视频| 亚洲免费视频中文字幕| 亚洲午夜国产成人av电影男同| 在线精品亚洲| 亚洲精品国产无天堂网2021| 狠狠色丁香婷婷综合| 欲色影视综合吧| 在线观看福利一区| 亚洲精品免费在线| 91久久精品www人人做人人爽 | 欧美日韩日日骚| 欧美国产精品日韩| 欧美美女视频| 国产噜噜噜噜噜久久久久久久久| 国产精品久久久久99| 国产精品视频免费观看| 国产一本一道久久香蕉| 在线免费一区三区| 中文精品视频| 久久频这里精品99香蕉| 亚洲春色另类小说| 国产精品99久久99久久久二8 | 久热精品视频在线观看一区| 欧美在线一区二区三区| 亚洲国产精品久久久久秋霞蜜臀 | 亚洲伦理自拍| 亚洲一区二区三区四区在线观看 | 久久久久国内| 国产精品夫妻自拍| 亚洲国产婷婷综合在线精品| 亚洲天堂av在线免费| 欧美成年人视频网站欧美| 亚洲精品一区二区三区樱花| 亚洲一区二区三区高清不卡| 久久久无码精品亚洲日韩按摩| 欧美日韩成人综合在线一区二区| 狠狠色噜噜狠狠狠狠色吗综合| 亚洲天堂成人在线观看| 亚洲电影免费观看高清完整版在线观看| 亚洲激情视频网站| 噜噜噜躁狠狠躁狠狠精品视频| 国产精品大全| 欧美一区二区三区在线播放| 欧美成人一区二免费视频软件| 欧美在线二区| 亚洲第一中文字幕| 欧美波霸影院| 欧美精品色网| 性欧美xxxx大乳国产app| 一区二区三区黄色| 国产精品久久| 美女久久一区| 欧美日韩在线第一页| 亚洲视频香蕉人妖| 欧美在线一级va免费观看| 国产一区在线免费观看| 欧美激情麻豆| 国产精品久久久久久久久动漫 | 中文一区二区| 久久国产精品第一页 | 欧美高清视频一区二区| 99在线精品观看| 欧美一乱一性一交一视频| 午夜精品福利电影| 亚洲三级性片| 国产欧美日韩一区二区三区在线观看| 欧美一级视频| 欧美精品免费在线| 欧美在线观看网站| 欧美精品二区| 欧美成人网在线| 国产视频观看一区| 亚洲天天影视| 亚洲一区二区三区在线观看视频 | 99精品欧美一区二区蜜桃免费| 国产精品久久久久一区二区三区 | 亚洲先锋成人| 欧美成人亚洲成人| 久久久噜噜噜久久人人看| 国产精品久久久久久久浪潮网站| 欧美 日韩 国产 一区| 国内综合精品午夜久久资源| 夜夜精品视频一区二区| 一本一本a久久| 欧美日韩精品一区二区三区四区 | 欧美日韩高清免费| 亚洲国产精品va在线看黑人动漫 | 99re6这里只有精品| 欧美高清视频www夜色资源网| 欧美成人网在线| 亚洲精品影院在线观看| 欧美午夜在线一二页| 亚洲制服av|