Имам модул на ядрото на Linux, който изчислява статистика на мрежовите пакети между няколко процесора (в адресното пространство на ядрото). Периодично изчиствам съответната част от паметта и силно се нуждая от това действие, за да влезе в сила незабавно за всички процесори, в противен случай то ще изкриви последващите статистически стойности. Моят целеви CPU е 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