text: 在多執行緒環境中， 冒險指標是一種解決由無鎖 資料結構中的節點動態記憶體管理引起的問題的方法。 這些問題通常僅在沒有自動垃圾收集的環境中出現。使用比較和交換原語的任何無鎖資料結構都必須處理ABA問題。 例如，在使用連結串列實現的無鎖堆疊中，一個執行緒可能正在嘗試從堆疊的前面彈出專案。 它會記住自棧頂而下的第二個值“B”，然後執行compare_and_swap(target=&amp;head, newvalue=B, expected=A) 不幸的是，在此操作正在執行時，另一個執行緒可能執行了兩次彈出操作，然後將A推回頂部，從而導致堆疊。此外，任何包含以下形式程式碼的無鎖演算法Node* currentNode = this-&gt;head; // assume the load from "this-&gt;head" is atomicNode* nextNode = currentNode-&gt;next; // assume this load is also atomic在沒有自動垃圾收集的情況下，它還面臨另一個主要問題。 在這兩行之間，另一個執行緒可能會彈出codice_1指向的節點並對其進行記憶體分配，這意味著透過第二行上的codice_2進行的記憶體訪問讀取了已釋放的記憶體。冒險指標可用於同時解決這兩個問題。 在使用冒險指標的系統中，每個執行緒都保留一個冒險指標的列表 ，這些指標指示該執行緒當前正在訪問的節點。 冒險指標列表上的節點不得被任何其他執行緒修改或釋放。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."—— 當執行緒希望刪除一個節點時，它將其放置在“稍後釋放”的節點列表上，但實際上直到其他執行緒的危險列表中沒有包含指標時才真正釋放該節點的記憶體。 可以透過專用的垃圾回收執行緒來完成此手動垃圾回收。在2002年， IBM的 Maged Michael提出了關於冒險指標技術的美國專利申請， 但該申請在2010年被放棄。冒險指標的替代方法包括引用計數 。
metadata: erhwenkuo/wikipedia-zhtw
metadata: 冒險指標
metadata: https://zh.wikipedia.org/wiki?curid=6877058