developer tip

std :: atomic을 통해 휘발성 한정자가 사용되는 이유는 무엇입니까?

optionbox 2020. 10. 29. 08:03
반응형

std :: atomic을 통해 휘발성 한정자가 사용되는 이유는 무엇입니까?


내가 Herb Sutter다른 사람들 로부터 읽은 내용에서 당신은 volatile동시 프로그래밍이 적어도 C / C ++에 관한 한 완전히 직교적인 개념 이라고 생각할 것입니다 .

그러나 GCC 구현에서는의 모든 std::atomic멤버 함수에 volatile한정자가 있습니다. 동일은 앤서니 윌리엄스의의 사실이다 구현std::atomic.

그래서 거래는 무엇입니까, 내 atomic<>변수가 필요 volatile합니까?


volatile한정자가 전체적으로 사용되는 이유는 무엇 std::atomic입니까?

따라서 휘발성 객체도 원 자성이 될 수 있습니다. 참조 여기 :

관련 견적은

함수와 연산은 휘발성 객체와 함께 작동하도록 정의되어 있으므로 휘발성이어야하는 변수도 원자적일 수 있습니다. 그러나 휘발성 한정자는 원자성에 필요하지 않습니다.

atomic<>변수가 필요 volatile합니까?

아니요, 원자 객체는 휘발성 일 필요가 없습니다.


다른 사람들이 올바로 작성한 내용을 요약하면

C / C ++ volatile는 하드웨어 액세스 및 인터럽트 용입니다. C ++ 11 atomic<>은 스레드 간 통신용입니다 (예 : 잠금없는 코드). 이 두 가지 개념 / 용도는 직교하지만 요구 사항이 겹치기 때문에 사람들이 종종 두 가지를 혼동합니다.

그 이유 atomic<>는 가능성이 원칙적으로 객체 모두 할 수 있기 때문에 휘발성 자격을 갖춘 기능을 가지고, 그것은 CONST 자격을 갖춘 기능을 가지고 같은 이유 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;
};

참고 URL : https://stackoverflow.com/questions/2479067/why-is-the-volatile-qualifier-used-through-out-stdatomic

반응형