Почему Летучий квалификатор используется через out std:: atomic?



из того что я читал от Херб Саттер и другие можно подумать, что volatile и параллельное программирование были полностью ортогональными понятиями, по крайней мере, в том, что касается C/C++.



однако, в GCC реализация все std::atomic функции-члены имеют volatile квалификатор. То же самое верно и в Энтони Уильямсе реализация на std::atomic.



так в чем дело, у меня atomic<> переменные должны быть volatile или нет?

610   3  

3 ответов:

почему volatile квалификатор используется во всем std::atomic?

так что летучие объекты могут быть атомарными. Смотрите здесь:

соответствующая цитата

функции и операции определены для работы с летучими объектами, так что переменные, которые должны быть летучими, также могут быть атомарными. Летучий классификатор, однако, не требуется для атомарности.

у меня atomic<> переменные должны быть volatile или нет?

нет, атомные объекты не должны быть летучими.

обобщить то, что другие правильно написали:

C / C++ volatile для аппаратного доступа и прерываний. C++11 atomic<> предназначен для межпотоковой связи (например, в коде без блокировки). Эти два понятия / использования ортогональны, но они имеют перекрывающиеся требования, и именно поэтому люди часто путают их.

причина в том, что atomic<> имеет волатильн-квалифицированные функции такая же причина она имеет Конст-квалифицированные функции, потому что возможно внутри принцип для объекта быть как atomic<> и const и/или volatile.

конечно, как указала моя статья, Еще одним источником путаницы является то, что C / C++ volatile Это не то же самое, что C#/Java volatile (последнее в основном эквивалентно C++11 atomic<>).

как 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

    Ничего не найдено.