The typical problem with modifying dynamically allocated nodes is the ABA problem: other threads may modify nodes while you are working on them. In this solution, each thread keeps a list of hazard pointers indicating which nodes the thread is currently accessing. This list can only be written to by the owning thread but can be read by any thread. When a thread wishes to remove a node, it places it on a private list and periodically scans the lists of all other threads for pointers referencing that node. If no such pointers are found the memory occupied by the node can be safely freed.
Hazard pointer basically is a mechanism for a thread to declare to other threads it has to 'look-out' for them. Dr. Michael analyzed a large number of lock-free data structures and found all requires one or two hazard pointers per thread only.
(C++ oriented article).
- C++ implementation of Hazard Pointer and lock-free data structures
- C++ implementation of Hazard Pointer (called "SMR") and other lock-free data structures. Also has Java interfaces.
- C implementation of Hazard Pointer and lock-free data structures
- C/C++ library that has a Hazard Pointer implementation
- Contains C++ implementation for Windows in appendices