Hazard pointer
   HOME

TheInfoList



OR:

In a multithreaded
computing Computing is any goal-oriented activity requiring, benefiting from, or creating computer, computing machinery. It includes the study and experimentation of algorithmic processes, and the development of both computer hardware, hardware and softw ...
environment, hazard pointers are one approach to solving the problems posed by dynamic memory management of the nodes in a lock-free
data structure In computer science, a data structure is a data organization and storage format that is usually chosen for Efficiency, efficient Data access, access to data. More precisely, a data structure is a collection of data values, the relationships amo ...
. These problems generally arise only in environments that don't have automatic garbage collection.Anthony Williams. ''C++ Concurrency in Action: Practical Multithreading.'' Manning:Shelter Island, 2012. See particularly Chapter 7.2, "Examples of lock-free data structures". Any lock-free data structure that uses the compare-and-swap primitive must deal with the ABA problem. For example, in a lock-free stack represented as an intrusively linked list, one thread may be attempting to pop an item from the front of the stack (A → B → C). It remembers the second-from-top value "B", and then performs compare_and_swap(target=&head, newvalue=B, expected=A). Unfortunately, in the middle of this operation, another thread may have done two pops and then pushed A back on top, resulting in the stack (A → C). The compare-and-swap succeeds in swapping `head` with `B`, and the result is that the stack now contains garbage (a pointer to the freed element "B"). Furthermore, any lock-free algorithm containing code of the form Node* currentNode = this->head; // assume the load from "this->head" is atomic Node* nextNode = currentNode->next; // assume this load is also atomic suffers from another major problem, in the absence of automatic garbage collection. In between those two lines, it is possible that another thread may pop the node pointed to by this->head and deallocate it, meaning that the memory access through currentNode on the second line reads deallocated memory (which may in fact already be in use by some other thread for a completely different purpose). Hazard pointers can be used to address both of these problems. In a hazard-pointer system, each thread keeps a
list A list is a Set (mathematics), set of discrete items of information collected and set forth in some format for utility, entertainment, or other purposes. A list may be memorialized in any number of ways, including existing only in the mind of t ...
of hazard pointers indicating which nodes the thread is currently accessing. (In many systems this "list" may be probably limited to only one (C++ oriented article) or two elements.) Nodes on the hazard pointer list must not be modified or deallocated by any other thread. When a thread wishes to remove a node, it places it on a list of nodes "to be freed later", but does not actually deallocate the node's memory until no other thread's hazard list contains the pointer. This manual garbage collection can be done by a dedicated garbage-collection thread (if the list "to be freed later" is shared by all the threads); alternatively, cleaning up the "to be freed" list can be done by each worker thread as part of an operation such as "pop" (in which case each worker thread can be responsible for its own "to be freed" list). In 2002, Maged Michael of
IBM International Business Machines Corporation (using the trademark IBM), nicknamed Big Blue, is an American Multinational corporation, multinational technology company headquartered in Armonk, New York, and present in over 175 countries. It is ...
filed an application for a U.S. patent on the hazard pointer technique, but the application was abandoned in 2010. Alternatives to hazard pointers include reference counting.


See also

* Concurrent data structure * Hazard (computer architecture) *
Finalizer In computer science, a finalizer or finalize method is a special method that performs finalization, generally some form of cleanup. A finalizer is executed during object destruction, prior to the object being deallocated, and is complementary ...


References

*


External links


Concurrent Building Blocks
- C++ implementation of Hazard Pointer (called "SMR") and other lock-free data structures. Also has Java interfaces.
Concurrency Kit
{{Webarchive, url=https://web.archive.org/web/20140601032152/http://concurrencykit.org/ , date=2014-06-01 - C implementation of Hazard Pointer and lock-free data structures
Atomic Ptr Plus
- C/C++ library that has a Hazard Pointer implementation
The parallelism shift and C++'s memory model
- Contains C++ implementation for Windows in appendices
libcds
- C++ library of lock-free containers and Hazard Pointer implementation Programming constructs