Я пытаюсь найти способ написать приложение с IPC без блокировки на Linux, в C, с многоядерными процессорами.
Давайте предположим, что у меня есть процесс 1 и процесс 2, которые пишут в FIFO или разделяемую память. Затем процесс 3 и процесс 4 будут считываться из этой общей памяти или FIFO.
Возможно ли это с помощью алгоритма без блокировки?
Ваше руководство высоко ценится.
c
linux
multithreading
поли
источник
источник
Ответы:
Я видел упоминание об использовании кольцевых буферов и контролируемого доступа к указателям местоположения, чтобы устранить или уменьшить необходимость в блокировках. Это не устраняет необходимость ожидания, и должно работать только тогда, когда кольцевой буфер имеет одного записывающего и одно считывающее устройство. В вашем случае вам понадобится как минимум два буфера.
Механизм, насколько я понимаю, таков:
писатель обновляет указатель последней записи.
читатель ждет, пока в кольцевом буфере не появится доступная запись (последняя! = текущая).
В зависимости от используемого времени ожидания это может добавить задержку для новых элементов в пустой очереди или сжечь много циклов ЦП в цикле ожидания. Порядок обновления указателя и строгое разделение доступа на запись имеют решающее значение для этой работы. Записывающему устройству разрешено только записывать запись кольцевого буфера до увеличения указателя, чтобы сделать его доступным для читателя.
источник
Да, это возможно. Мы используем один из алгоритмов очереди без блокировки в нашем проекте. Но эти алгоритмы действительно не очевидны. Если вы хотите понять их глубже, вы должны быть готовы потратить пару месяцев на это.
источник
Интер процесс общение не может быть безблокировочным. Только межпоточная. Насколько я знаю.
источник