contributed by < Risheng1128
>
1
延伸問題:
是否有必要先將數值轉成字串?用十進位的角度處理運算是否產生額外的計算負擔?
2
延伸問題:
首先從實作中兩個重要的結構 domain_t
及 hp_t
開始討論
從結構定義可以很明顯的看出兩種結構分別的用意
domain_t
用來建立管理 hazard pointer 和 retire list 的結構,其中 deallocator
是用來釋放記憶體的函式指標hp_t
為一般的 linked list 實作,用來儲存共享資料,並加進 hazard pointer 或 retire list ,ptr
則是正在讀取的資料的地址以上述的結構定義可以得到和題目一樣的架構
接著討論結構的建立以及釋放,實作為函式 init
及 deinit
函式 init
的部份,一共做了兩件事
config_t
) ,並且由指標 shared_config
指著,以下為函式 create_config
的實作
config_dom
指著,以下為函式 domain_new
的實作
函式 deinit
則是將 shared_config
和 config_dom
分別釋放,以下為函式實作
程式主要執行的部份可以分為 reader thread
及 writer thread
,首先討論 reader thread
的部份
函式 reader_thread
最主要的步驟就是先將讀取資料(這邊是 shared_config
) 加進 hazard pointer (line 7
) ,成功之後進行資料讀取的動作 (line 11
) ,最後將該節點從 hazard pointer 移除 (line 12
)
接著分析資料加進 hazard pointer 的實作部份,即函式 load
首先判斷 val
是否已經存在於 hazard pointer 裡 (line 12
) ,接著判斷 hazard pointer 是否加入成功 (line 17
) ,如果是就回傳資料的地址 val
,如果否就繼續判斷 val
是否在 retired list 裡,如果是就從 retired list 移除 (line 28
)
函式 list_insert_or_append
need_alloc
判斷是否需要建立新的節點list_append
新增節點到 hazard pointer 的 linked list 上-函式 list_append
最後討論函式 drop
的部份
函式 drop
主要的功能是將 hazard pointer 裡儲存資料 safe_val
的節點移除
從函式 list_remove
可以得知移除節點的方式是利用巨集函式 atomic_cas
,當 node->ptr
等於 expected
時, nullptr
會複製給 node->ptr
最後總結 reader thread 的執行步驟
以下分析 writer thread 執行的函式
函式 writer_thread
一共執行以下步驟
函式 swap
將新的資料地址 new_val
複製到指標 prot_ptr
所指到的地址,並且釋放原本的資料 old_obj
函式 cleanup_ptr
會根據不同的情況釋放空間
函式 list_contains
用來判斷 linked list 裡是否包含儲存資料 ptr
的節點