Действительно ли несколько-производителей, единственный потребитель возможен в установке lockfree?

У меня есть набор потоков, которые делают большую связь друг с другом. Я предпочел бы, чтобы это было свободной блокировкой.

Для каждого потока я хочу иметь почтовый ящик, куда другие потоки могут отправить, он обменивается сообщениями, (но только владелец может удалить сообщения). Это - ситуация единственного потребителя нескольких-производителей. для меня действительно ли возможно сделать это в lockfree / высокопроизводительный вопрос? (Это находится во внутреннем цикле гигантского моделирования.)

10
задан anon 9 November 2010 в 14:12
поделиться

3 ответа

Конечно, если у вас есть атомарная инструкция 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; (в таком порядке).

3
ответ дан 3 December 2019 в 22:37
поделиться

Может захотеть посмотреть на блоки строительных блоков Intel Thread, я вспоминаю, что я вспоминаю лекцию от разработчика Intel, который упомянул что-то вдоль этих строк.

0
ответ дан 3 December 2019 в 22:37
поделиться

Вот бумаги из Университета Рочестера, иллюстрирующих неблокирующие параллельные очереди . Алгоритм, описанный в статье, показывает одну технику для изготовления бессобойной очереди.

2
ответ дан 3 December 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: