- There are a number of tasks
Tasks
are the samenumber of task queues as CPUs
- A
worker
has a task queue - A worker
pushs
/pops
tasks from its own task queue - A worker takes tasks from other workers
Pop
/push
accesses thebottom of task queues
- Take accesses the
top of task queues
-
Task queue is implemented as
unbound circular array
which doesn't have start and end points and expands when the size is less than the number of tasks. -
There are already some implementation of Lock-free Work-stealing Deque. But one written in C is not so common. Unlike some languages like Java, the support of
volatile
variable is limited in C. This implementation covers it by using memory barriers. -
This uses
compare-and-swap (CAS) instruction
instead ofmutex lock
.
Compile the deque source.
make
To test the unit test of deque, just type
make TEST_gsoc_taskqueue
You can see the number of CPUs used in test and calculation time by
./test_gsoc_taskqueue > /dev/null
If you also want to test circular array, type
make TEST_gsoc_task_circular_array
Note that it will fail if you use 32-bit CPUs. Or if you want to test all of them,
make test
you can clean the directory.
make clean