(оставив это здесь пока, но см. Редактирование.)
Вы знаете реализацию очереди без блокировки в C?
Я недавно написал очередь без блокировки(http://www.ideone.com/l2QRp). На самом деле я не могу гарантировать, что он работает правильно, но я не могу найти каких-либо ошибок, и я использовал его в нескольких однопоточных программах без проблем, поэтому естьв этом нет ничего слишком очевидного.
Пример тривиального использования:
queue_t queue;
int val = 42;
queue_init(&queue,sizeof val);
queue_put(&queue,&val);
val = 0;
queue_pop(&queue,&val);
printf("%i\n",val); // 42
queue_destroy(&queue);
Редактировать:
Как указал @Alexey Kukanov, queue_pop может завершиться неудачей, если выскочить tmp
, освобожден, выделен снова и снова помещен между проверкой на нулевое значение и обменом:
if(!tmp->next) return errno = ENODATA;
/* can fail here */
} while(!sync_swap(q->head,tmp,tmp->next));
Я пока не уверен, как это исправить, но я (надеюсь) обновлю это, как только выясню этоА пока не обращайте на это внимания.