tlock-queue is a simple, concurrent, multi-producer, multi-consumer queue implementation in pure C using C11 threads' mutexes. It is based on the two lock queue presented by Maged M. Michael and Michael L. Scott in their paper titled Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms.
To compile the test program (tlock_test.c) just run make or make tlock. The library can be also compiled as a static (make static) or shared (make shared) library. No dependencies are needed, just C11 thread support.
The following code illustrates the use of the public API.
tlock_queue_tqueue;
int*element;
intrc;
/* Allocate an element to be added to the queue */element=malloc(sizeof(int));
*element=420;
/* Queue initialization. Returns TLOCK_ERROR on error */rc=tlock_init(&queue);
if (rc!=TLOCK_OK)
handle_error();
/* Add the element to the queue. Returns TLOCK_OK on success, TLOCK_ERROR on error */rc=tlock_push(&queue, element);
if (rc!=TLOCK_OK)
handle_error();
/* * Get the number of elements in the queue. In a multithreaded environment this function returns * a mininum guarantee, but the actual number of elements could be higher. It blocks `tlock_pop()` * calls on other threads, but not `tlock_push()` calls. */assert(tlock_min_size(&queue) ==1);
/* Retrieve the element from the queue. Returns NULL on empty queue. */element=tlock_pop(&queue);
if (!element)
handle_error();
/* This assertion will never fail */assert(*element==420);
/* Finally, free the element and the queue */free(element);
tlock_free(queue);