휘발성 C++

Hwibalseong C

“휘발성 키워드 동작은 일반적으로 하드웨어 종속으로 간주되어야 하므로 사용자 공간 응용 프로그램 개발자는 항상 관련 컴파일러 설명서를 참조하여 한정자가 다양한 컨텍스트에서 처리될 수 있는 방법을 배워야 합니다. 객체가 휘발성으로 표시되면 컴파일러는 로드 작업에 최적화되어서는 안 되며 항상 레지스터나 캐시가 아닌 기본 메모리에서 검색해야 한다는 알림을 받습니다. 그러나 컴파일러가 메모리 위치를 레지스터에 넣으려고 하면 소프트웨어에서는 거의 사용할 수 없고 하드웨어에서만 유지 관리되는 수많은 계층의 캐시가 있더라도 자동으로 캐시됩니다. 결과적으로 동일한 메모리 위치에서보다 CPU 근처의 캐시 라인에서 RAM에 액세스할 수 있습니다.

최적화가 활성화된 경우 코드가 예상대로 작동하지 않을 수 있음을 포함하는 휘발성 한정자를 사용하지 않으면 문제가 발생할 수 있습니다. 인터럽트가 활용되고 활성화되면 코드가 계획대로 작동할 수 없습니다. 데이터는 전원이 켜져 있는 동안에만 휘발성 저장소에 유지됩니다. 공급이 제거되면 데이터 손실이 발생합니다.

그러나 비휘발성 저장소는 전원이 꺼지더라도 데이터를 유지합니다. 프로세스 정보는 비휘발성 저장소보다 훨씬 빠르기 때문에 휘발성 저장소에 잠시 저장됩니다. 비휘발성 저장소와 달리 휘발성 저장소는 민감한 데이터를 보호하는 데 더 적합합니다. 전원이 꺼지면 데이터에 액세스할 수 없기 때문입니다. 휘발성 스토리지는 컴퓨터 시스템이 그 중 몇 MB에서 몇 GB만 수용할 수 있기 때문에 많은 비용이 듭니다.”



C++의 휘발성 한정자의 속성

C++ 휘발성 한정자 수단은 여기에서 설명됩니다. 변수를 선언할 때 한정자 '휘발성'이 적용됩니다. 값이 언제든지 변할 수 있음을 컴파일러에 알리는 역할을 합니다. 휘발성은 아래 나열된 특성 중 일부를 가지고 있습니다.



• 메모리 할당은 volatile 키워드로 변경할 수 없습니다.



• 레지스터의 변수를 캐시할 수 없습니다.

• 할당의 경우 값을 변경할 수 없습니다.

C++에서 휘발성 한정자의 사용

1. 코드가 변수의 값을 수정하지 않음에도 불구하고 그렇게 할 수 있습니다. 결과적으로 컴파일러는 변수의 상태를 확인할 때마다 변수에서 읽은 가장 최근 값 또는 저장된 가장 최근 값과 동일하다고 가정할 수 없습니다. 오히려 변수의 값을 다시 한 번 획득해야 합니다.



2. 컴파일러는 외부에서 볼 수 있는 '부작용'으로 값을 휘발성 변수에 저장할 때 발생하므로 값을 저장하는 행위를 제거할 필요가 없습니다. 예를 들어, 두 개의 값이 한 행에 배치되면 컴파일러는 값을 두 번 배치해야 합니다.

C++의 휘발성 한정자의 구문

# 휘발성 data_type variable_name

volatile 키워드는 선언에 사용해야 하며 데이터 유형은 double, float 또는 integer를 포함한 모든 데이터 유형을 나타냅니다. 마지막으로 변수의 이름을 선택합니다. 두 선언 모두 유효하기 때문에 두 방법 중 하나를 사용하여 휘발성 변수를 정의할 수 있습니다.

예: 휘발성 한정자는 C++에서 다른 스레드 또는 외부 작업에 의해 수정할 수 있는 개체를 식별하는 데 사용됩니다.

외부 신호나 인터럽트 역할을 하는 프로시저에 의해 객체가 변경되면 그 동안 캐시된 상태가 더 이상 적절하지 않기 때문에 변경된 값을 RAM에서 검색해야 합니다. 결과적으로 컴파일러는 휘발성 개체에 대한 액세스를 적절하게 처리합니다.

#include
#include
#include <스레드>

표준 사용 :: 쫓다 ;
표준 사용 :: ;
표준 사용 :: 세르 ;
표준 사용 :: 먹기 ;

휘발성 물질 정수 = 0 ;

무효의 5초 지연 ( ) {
동안 ( < ) {
잠자다 ( 200000 ) ;
세르 << '대기 중...' << ;
}
}

무효의 증분초 ( ) {
~을 위한 ( 정수 = 0 ; < 5 ; ++ ) {
( 1 ) ;
세르 << '증가' << ;
= + 1 ;
}
}

정수 기본 ( ) {
구조체 시간의 시작 { } ;
구조체 시간의 끝 { } ;
표준 :: 스레드1 ;

스레드1 = 표준 :: ( 증분초 ) ;

5초 지연 ( ) ;

스레드1. 가입하다 ( ) ;
반품 EXIT_SUCCESS ;
}


잠재적인 시나리오를 설명하기 위해 변수가 'int' 데이터 유형인 Second로 선언되고 0 값이 할당된 volatile 키워드를 사용했습니다. 그런 다음 두 가지 함수를 구성합니다. 하나는 전역 휘발성 정수 변수를 변경하는 'DelayFiveSeconds'이고 다른 하나는 while 루프 내에서 동일한 평가를 수행하는 'IncrementSeconds'입니다. 이 예에서는 초가 3보다 작아야 할 때 while 루프가 초 동안 반복되도록 허용한다는 점에 유의해야 합니다.

조건이 충족되면 while 블록이 실행됩니다. while 블록 내에서 'waiting' 문을 인쇄하는 unsleep 메서드를 호출했습니다. 'IncrementSceonds' 함수에는 for 루프가 있습니다. 반복 후에 'increment' 문을 인쇄하고 'seconds' 변수를 증가시키는 sleep 메서드가 호출됩니다. 'IncrementSeconds' 함수의 초기 실행은 메인 함수에 의해 생성된 별도의 스레드에 의해 수행됩니다. 그런 다음 'DelayFiveSeconds' 메서드가 기본 스레드에 의해 호출되어 초 변수가 값 5 이상으로 이동하지 않으면 종료되지 않는 루프를 입력합니다.

메인 스레드는 초 변수의 값이 변경된 것을 알아차리자마자 다른 스레드가 이미 동시에 값을 늘리기 시작했기 때문에 메서드에서 반환합니다.

C++에서 스레드 코드를 실행하려면 'g++ -pthread -o filename filename.cc' 명령을 사용해야 합니다. 명령에 '-pthread'를 배포하지 않으면 컴파일러에서 예외가 throw될 가능성이 있습니다. 그 결과 휘발성 객체가 외부의 힘에 의해 변경될 때까지 기다리는 조건부 대기 함수를 효과적으로 만들었습니다. 휘발성 한정자가 제거되고 기존 전역 변수가 사용되는 경우 이 코드가 여전히 동일하게 작동하더라도 업데이트 코드 블록이 다른 번역 섹션 또는 외부 신호 동작에서 올 수 있음을 명심하는 것이 중요합니다.

결론

여기에서는 더 나은 이해를 위해 구문, 사용법, 적절한 예와 함께 C++의 휘발성에 대한 개요를 살펴봅니다. 컴파일러는 값을 예측할 수 없기 때문에 volatile은 C 프로그래밍에서 매우 중요합니다. volatile 활용의 주요 이점은 사용자가 수정을 요청할 때마다 또는 동일한 변수를 사용하는 다른 스레드가 활성 상태일 때 값이 달라질 수 있다는 것입니다.