У меня есть набор потоков, которые делают большую связь друг с другом. Я предпочел бы, чтобы это было свободной блокировкой.
Для каждого потока я хочу иметь почтовый ящик, куда другие потоки могут отправить, он обменивается сообщениями, (но только владелец может удалить сообщения). Это - ситуация единственного потребителя нескольких-производителей. для меня действительно ли возможно сделать это в lockfree / высокопроизводительный вопрос? (Это находится во внутреннем цикле гигантского моделирования.)
Конечно, если у вас есть атомарная инструкция CompareAndSwap
:
for (i = 0; ; i = (i + 1) % MAILBOX_SIZE)
{
if ((mailbox[i].owned == false) &&
(CompareAndSwap(&mailbox[i].owned, true, false) == false))
break;
}
mailbox[i].message = message;
mailbox[i].ready = true;
После прочтения сообщения потребляющий поток просто устанавливает mailbox[i].ready = false; mailbox[i].owned = false;
(в таком порядке).
Может захотеть посмотреть на блоки строительных блоков Intel Thread, я вспоминаю, что я вспоминаю лекцию от разработчика Intel, который упомянул что-то вдоль этих строк.
Вот бумаги из Университета Рочестера, иллюстрирующих неблокирующие параллельные очереди . Алгоритм, описанный в статье, показывает одну технику для изготовления бессобойной очереди.