Почему Летучий квалификатор используется через out std:: atomic?
из того что я читал от Херб Саттер и другие можно подумать, что volatile и параллельное программирование были полностью ортогональными понятиями, по крайней мере, в том, что касается C/C++.
однако, в GCC реализация все std::atomic функции-члены имеют volatile квалификатор. То же самое верно и в Энтони Уильямсе реализация на std::atomic.
так в чем дело, у меня atomic<> переменные должны быть volatile или нет?
3 ответов:
почему
volatileквалификатор используется во всемstd::atomic?так что летучие объекты могут быть атомарными. Смотрите здесь:
соответствующая цитата
функции и операции определены для работы с летучими объектами, так что переменные, которые должны быть летучими, также могут быть атомарными. Летучий классификатор, однако, не требуется для атомарности.
у меня
atomic<>переменные должны бытьvolatileили нет?нет, атомные объекты не должны быть летучими.
обобщить то, что другие правильно написали:
C / C++
volatileдля аппаратного доступа и прерываний. C++11atomic<>предназначен для межпотоковой связи (например, в коде без блокировки). Эти два понятия / использования ортогональны, но они имеют перекрывающиеся требования, и именно поэтому люди часто путают их.причина в том, что
atomic<>имеет волатильн-квалифицированные функции такая же причина она имеет Конст-квалифицированные функции, потому что возможно внутри принцип для объекта быть какatomic<>иconstи/илиvolatile.конечно, как указала моя статья, Еще одним источником путаницы является то, что C / C++
volatileЭто не то же самое, что C#/Javavolatile(последнее в основном эквивалентно C++11atomic<>).
как const, volatile является транзитивным. Если вы объявляете метод как
volatileтогда вы не можете вызвать какой-либо энергонезависимый метод на нем или любой из его атрибутов-членов. При наличииstd::atomicметодыvolatileвы разрешаете звонки отvolatileметоды-члены в классах, содержащихstd::atomicпеременные.у меня не очень хороший день... так запутанно... может быть, небольшой пример поможет:
struct element { void op1() volatile; void op2(); }; struct container { void foo() volatile { e.op1(); // correct //e.op2(); // compile time error } element e; };
Comments