  Work-stealing is a popular technique to implement dynamic load balancing in a
distributed manner. In this approach, each process owns a set of tasks that
have to be executed. The owner of the set can put tasks in it and can take
tasks from it to execute them. When a process runs out of tasks, instead of
being idle, it becomes a thief to steal tasks from a victim. Thus, a
work-stealing algorithm provides three high-level operations: Put and Take,
which can be invoked only by the owner, and Steal, which can be invoked by a
thief. One of the main targets when designing work-stealing algorithms is to
make Put and Take as simple and efficient as possible. Unfortunately, it has
been shown that any work-stealing algorithm in the standard asynchronous model
must use expensive Read- After-Write synchronization patterns or atomic
Read-Modify-Write instructions, which may be costly in practice. Thus, prior
research has proposed idempotent work-stealing, a relaxation for which there
are algorithms with Put and Take devoid of Read-Modify-Write atomic
instructions and Read-After-Write synchronization patterns; however, Put uses
fences among Write instructions, and Steal uses Compare&Swap and fences among
Read instructions. In the TSO model, in which Write (resp. Read) instructions
cannot be reordered, there have been proposed fully fence-free work-stealing
algorithms whose Put and Take have similar properties but Steal uses
Compare&Swap or a lock.
