Здравствуйте.
Основные механизмы многопоточности, с которыми я сталкивался, это mutex и atomic. У atomic есть аргументы, предназначенные для упорядочивания доступа к памяти, которые в некоторых библиотечных функциях обычно задаются по умолчанию.
memory_order_seq_cst – указывает на sequential consistent модель
memory_order_acquire, memory_order_release, memory_order_acq_rel, memory_order_consume – относятся к модели, основанной на acquire/release семантике
memory_order_relaxed – указывает на relaxed-модель
Также есть барьеры. Часто ли перечисленные аргументы и барьеры нужны на практике в тех проектах, где используется многопоточность или их необходимо знать в редких узкоспециализированных областях? Если в редких узкоспециализированных, то в каких именно? Правильно ли я понимаю, что механизмы упорядочивания памяти и барьеры служат для написания кода, свободного не только от блокировок, но и от ожиданий?