Если вашей целью является производственный код, просто не делайте этого;использовать замки.
В вашем предыдущем вопросе у вас достаточно информации, объясняющей почему.Правильные реализации без блокировок даже простых структур данных, таких как очередь и стек, при отсутствии сборщика мусора являются сложными и сложными из-за (в) известной проблемы ABA .К сожалению, некоторые исследовательские работы не принимают ABA во внимание по каким-либо причинам;Ваш псевдокод, кажется, взят из одной из таких статей.Если вы преобразуете его в C и используете выделенную кучу память для узлов, это приведет к недетерминированным ошибкам при использовании в реальном коде.
Если вы делаете этот материал для получения опыта, то не ожидайте, что SO товарищи решатэто для вас.Вы должны прочитать все цитируемые материалы и многое другое, убедиться, что вы действительно понимаете все нюансы алгоритмов без блокировок, таких как ABA, изучаете различные методы, предназначенные для решения этой проблемы, изучаете существующие реализации без блокировок и т. Д.
Наконец, небольшое руководство по переводу данного псевдокода на C:
q^.value ← x
означает q_elem->data = x;
repeat ... until COMPARE&SWAP(head, p, p^.next)
эквивалентно do {...} while (!__sync_bool_compare_and_swap(q_obj->head, q_elem, q_elem->next);
, где q_obj
является экземпляром типа queue_t
(т.е. очередью), а q_elem
является экземпляром типа queueelem_t
(то есть узлом очереди).