Круглая очередь без блокировки с pthreads.Есть что-нибудь, на что стоит обратить внимание? - PullRequest
1 голос
/ 23 июня 2011

Я бы хотел реализовать кольцевую очередь без единого производителя для одного производителя между двумя pthreads;в C, в ARM Linux.

В очереди будут храниться байты, производитель запишет вещи в memcpy (), а потребитель запишет () их в файл.

Наивно ли этоЯ думаю, что я могу хранить смещения головы и хвоста в Ints, и все будет просто работать?Меня интересуют такие вещи, как оптимизация компилятора, означающая, что мои записи «голова / хвост» находятся в регистрах и невидимы для другого потока, или где-то нужен барьер памяти.

1 Ответ

4 голосов
/ 23 июня 2011

Модель целостности памяти pthreads не предлагает никакой помощи для построения алгоритмов без блокировки. Вы сами по себе - вам придется использовать любые атомарные инструкции и барьеры памяти, которые предоставляются и требуются вашей архитектурой. Вам также придется обратиться к документации по компилятору, чтобы определить, как запросить барьер компилятора.

Вам почти наверняка лучше использовать обычную реализацию очереди, защищенную мьютексом и условной переменной - если в очереди просто хранятся указатели на буферы, которые записываются в файл (а не на сами данные), тогда блокировка не должна Это не проблема, поскольку блокировку нужно будет удерживать, только когда указатель добавлен или удален из очереди.

...