Reads and writes an entry in a hash table atomically.
hcl
modify-hash hash-table key function => new-value, key
| hash-table⇩ |
A hash table. |
| key⇩ |
An object. |
| function⇩ |
A function designator. |
| new-value⇩ |
An object. |
| key |
An object. |
The function modify-hash locks the hash table hash-table. It then calls the function function with three arguments: key, the value currently associated with key in hash-table (if any), and a flag which is true if key was in the table. (This last argument is needed in case the associated value is nil).
When function returns a value new-value, modify-hash then sets new-value as the value for key in the table.
modify-hash then unlocks the hash table and returns two values, new-value and key.
The overall effect is like:
(with-hash-table-locked
hash-table
(multiple-value-bind (value found-p)
(gethash key hash-table)
(let ((new-value (funcall function
key value found-p)))
(setf (gethash key hash-table) new-value)
(values new-value key))))
but modify-hash should be more efficient.
It is guaranteed that no other thread can modify the value associated with key until modify-hash returns.
function is called with hash-table locked, so it should not do anything that may cause excessive delays, or that waits for another thread that tries to modify the table.
make-hash-table
with-hash-table-locked
19.3 Atomicity and thread-safety of the LispWorks implementation
19.5 Modifying a hash table with multiprocessing
LispWorks® User Guide and Reference Manual - 01 Dec 2021 19:30:35