У меня есть модуль ядра Linux, который вычисляет статистику сетевых пакетов между несколькими процессорами (в адресном пространстве ядра). Периодически я очищаю соответствующий фрагмент памяти и настоятельно нуждаюсь в том, чтобы это действие немедленно вступило в силу для всех процессоров, в противном случае это исказит последующие значения статистики. Мой целевой ЦП - Power PC, поэтому согласованность его кэша очень ослаблена. Таким образом, мне нужно вручную очистить кеши данных всех процессоров сразу после обнуления памяти.
Итак, что я должен разместить сразу после процедуры очистки:
memset(ptr, 0, size);
// what's going here?
need this action to take immediate effect for all CPUs
не имеет смысла для многопоточного программирования. Если значения статистики являются частью некоторого инварианта, который должен соблюдаться всеми процессорами, вам необходимо использовать блокировки (спин-блокировки, мьютексы) при доступе к ним. В некоторых случаях атомарные операции или барьеры памяти предоставляют такую же гарантию с меньшими затратами. В ядре Linux есть много других механизмов синхронизации. Но данной информации недостаточно для правильного выбора. - person Tsyvarev   schedule 27.09.2015