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 the key was in the table. (This last argument is needed in case the associated value is nil
).
modify-hash
then sets the result of the function function as the value for key in the table. modify-hash
returns two values, the new-value and the key.
(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 require hanging the modification, or that waits for another process that tries to modify the table.
make-hash-table
with-hash-table-locked
Atomicity and thread-safety of the LispWorks implementation
Modifying a hash table with multiprocessing
LispWorks User Guide and Reference Manual - 13 Feb 2015