(A)에서보고 한 무리 의 다른 질문 과 그 답변 , 나는 인상 얻을 C에서 "휘발성"키워드가 정확히 무엇을 의미하는지에 대한 더 광범위한 합의가없는합니다.
표준 자체조차도 모든 사람이 그것이 의미 하는 바에 동의 할만큼 명확하지 않은 것 같습니다 .
다른 문제들 중 :
- 하드웨어와 컴파일러에 따라 다른 보증을 제공하는 것 같습니다.
- 컴파일러 최적화에는 영향을 주지만 하드웨어 최적화에는 영향을 미치지 않으므로 자체 런타임 최적화를 수행하는 고급 프로세서에서는 컴파일러 가 방지하려는 최적화를 막을 수 있는지 여부조차 명확하지 않습니다 . (일부 컴파일러는 일부 시스템에서 일부 하드웨어 최적화를 방지하기위한 명령어를 생성하지만 어떤 방식 으로든 표준화되지 않은 것으로 보입니다.)
문제를 요약하면, 그것은 (많이 읽고) 나타납니다 "휘발성"보장 뭔가 같은 : 값을 읽을 수 있습니다 /이 아니라 /에서 레지스터에 기록하지만, 코어의 L1 캐시에 적어도, 같은 순서로한다는 점에서 읽기 / 쓰기가 코드에 나타납니다. 그러나 레지스터에서 읽고 쓰는 것이 동일한 스레드 내에서 이미 충분하기 때문에 L1 캐시로 조정한다고해서 다른 스레드와의 조정에 대해 더 이상 보장 할 수는 없습니다. L1 캐시와 동기화하는 것이 언제 중요한지 상상할 수 없습니다.
사용 1
휘발성을 널리 사용 하는 유일하게 사용되는 휘발성은 특정 메모리 위치가 (직접 하드웨어에서) 조명을 제어하는 메모리의 비트와 같이 I / O 기능에 하드웨어 매핑되는 구식 또는 내장형 시스템에서 사용되는 것으로 보입니다. 또는 키보드 키가 눌 렸는지 여부를 알려주는 메모리의 비트 (하드웨어가 키에 직접 연결했기 때문에).
멀티 코어 시스템을 포함하는 휴대용 코드에서는 "use 1"이 발생하지 않는 것 같습니다 .
USE 2
"use 1"과 크게 다르지 않은 경우 인터럽트 처리기 (조명을 제어하거나 키의 정보 저장)에 의해 언제든지 읽거나 쓸 수있는 메모리입니다. 그러나 이미이를 위해 우리는 시스템에 따라 인터럽트 핸들러 가 자체 메모리 캐시를 가진 다른 코어 에서 실행될 수 있으며 "휘발성"이 모든 시스템에서 캐시 일관성을 보장하지는 않는다는 문제가 있습니다.
따라서 "use 2"는 "volatile"이 제공 할 수있는 것 이상의 것으로 보입니다.
사용 3
내가 볼 수있는 유일한 확실한 다른 용도는 컴파일러가 인식하지 못하는 동일한 메모리를 가리키는 다른 변수를 통해 액세스가 잘못 최적화되는 것을 방지하는 것입니다. 그러나 이것은 사람들이 그것에 대해 이야기하지 않기 때문에 아마도 논란의 여지가 없습니다. 그리고 C 표준은 이미 "다른"포인터 (함수에 대한 다른 인수)가 동일한 항목이나 근처의 항목을 가리킬 수 있다는 것을 이미 인식하고 있으며 컴파일러가 그러한 경우에도 작동하는 코드를 생성해야한다고 이미 지정했습니다. 그러나 최신 (500 페이지!) 표준 에서이 주제를 빨리 찾을 수 없었습니다.
그래서 "사용 3"어쩌면 존재하지 않는 전혀?
따라서 내 질문 :
"휘발성"은 멀티 코어 시스템을위한 휴대용 C 코드로 무엇인가를 보장합니까?
편집-업데이트
최신 표준을 찾아 본 후에 는 대답이 최소한 매우 제한적인 것 같습니다.
1. 표준은 "volatile sig_atomic_t"특정 유형에 대한 특수 처리를 반복적으로 지정합니다. 그러나 표준에 따르면 다중 스레드 프로그램에서 신호 기능을 사용하면 정의되지 않은 동작이 발생합니다. 따라서이 사용 사례는 단일 스레드 프로그램과 해당 신호 처리기 간의 통신으로 제한됩니다.
2. 표준은 또한 setjmp / longjmp와 관련하여 "휘발성"에 대한 명확한 의미를 지정합니다. (중요한 코드 예제는 다른 질문 과 답변에 나와 있습니다.)
보다 정확한 질문은 다음과 같습니다
. "휘발성"은 (1) 단일 스레드 프로그램이 신호 처리기에서 정보를 수신하도록 허용하거나 (2) setjmp를 허용하는 것 외에 멀티 코어 시스템을위한 휴대용 C 코드에서 무엇이든 보장합니다. setjmp와 longjmp 사이에서 수정 된 변수를 보는 코드?
이것은 여전히 그렇습니다 / 아니오 질문입니다.
"yes"이면 "volatile"을 생략하면 버그가없는 이식 가능한 코드의 예를 보여줄 수 있다면 좋을 것입니다. "아니오"인 경우 멀티 코어 대상의 경우 컴파일러가이 두 가지 특별한 경우를 제외하고는 "휘발성"을 무시해도된다고 가정합니다.
volatile
구체적으로 필요한 것입니다.
volatile
프로그램에 비동기식으로 변경 될 수 있음 을 알리는 것입니다.