일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 플레이프레임워크
- 안드로이드 웹뷰
- 블록체인
- 엔터프라이즈 블록체인
- Golang
- Hyperledger fabric gossip protocol
- 파이썬 데이터분석
- Play2 로 웹 개발
- 스칼라
- 주키퍼
- 스위프트
- 스칼라 동시성
- 파이썬 강좌
- hyperledger fabric
- CORDA
- 그라파나
- Play2
- 파이썬
- Actor
- akka 강좌
- Akka
- Adapter 패턴
- 하이브리드앱
- play 강좌
- 파이썬 머신러닝
- 하이퍼레저 패브릭
- 파이썬 동시성
- 이더리움
- play2 강좌
- 스칼라 강좌
- Today
- Total
HAMA 블로그
자바 volatile / C volatile 정리 본문
Java volatile
- volatile 변수를 읽어 들일 때 CPU 캐시가 아니라 컴퓨터의 메인 메모리로 부터 읽어들입니다
. 그리고 volatile 변수를 쓸 때에도(write) CPU 캐시가 아닌 메인 메모리에 기록합니다.
줍니다. 아래 내용을 읽어보세요 ( 오해의 소지가 많을듯해서 원문을 직접보시는게 나음)
The Java volatile Happens-Before Guarantee
C/C++ volatile
volatile 키워드는 앞서 살펴본 하드웨어 제어를 포함하여 크게 3가지 경우에 흔히 사용된다.
(1) MMIO(Memory-mapped I/O)
(2) 인터럽트 서비스 루틴(Interrupt Service Routine)의 사용
(3) 멀티 쓰레드 환경
세 가지 모두 공통점은 현재 프로그램의 수행 흐름과 상관없이 외부 요인이 변수 값을 변경할 수 있다는 점이다. 인터럽트 서비스 루틴이나 멀티 쓰레드 프로그램의 경우 일반적으로 스택에 할당하는 지역 변수는 공유하지 않으므로, 서로 공유되는 전역 변수의 경우에만 필요에 따라 volatile을 사용하면 된다.
int done = FALSE;
void main()
{
...
while (!done)
{
// Wait
}
...
}
interrupt void serial_isr(void)
{
...
if (ETX == rxChar)
{
done = TRUE;
}
...
}
serial.c
위 시리얼 통신 예제는 전역 변수로 done을 선언해서 시리얼 통신 종료를 알리는 ETX 문자를 받으면 main 프로그램을 종료시킨다. 문제는 done이 volatile이 아니므로 main 프로그램은 while(!done)을 수행할 때 매번 메모리에서 done을 새로 읽어오지 않는다는 점이다. 따라서 serial_isr() 루틴이 done 플래그를 수정하더라도 main은 이를 모른 채 계속 루프를 돌고 있을 수 있다. done을 volatile로 선언해주면 매번 메모리에서 변수 값을 새로 읽어오므로 이 문제가 해결된다.
인터럽트의 경우와 마찬가지로 멀티 쓰레드 프로그램도 수행 도중에 다른 쓰레드가 전역 변수 값을 임의로 변경할 수 있다. 하지만 컴파일러가 코드를 생성할 때는 다른 쓰레드의 존재 여부를 모르므로 변수 값이 변경되지 않았다면 매번 새롭게 메모리에서 값을 읽어오지 않는다. 따라서 여러 쓰레드가 공유하는 전역 변수라면 volatile로 선언해주거나 명시적으로 락(lock)을 잡아야 한다.
이처럼 레지스터를 재사용하지 않고 반드시 메모리를 참조할 경우 가시성(visibility) 이 보장된다고 말한다. 멀티쓰레드 프로그램이라면 한 쓰레드가 메모리에 쓴 내용이 다른 쓰레드에 보인다는 것을 의미한다.
레퍼런스
http://tutorials.jenkov.com/java-concurrency/volatile.html <-- 자바 volatile 설명
http://skyul.tistory.com/337 <-- C/C++ volatile 설명
'Java' 카테고리의 다른 글
자바 EnumBitSet 사용하기 (0) | 2015.09.01 |
---|---|
자바 enum 정리 (0) | 2015.09.01 |
자바 Concurrent 라이브러리 정리 (0) | 2015.08.31 |
자바 쓰레드 점유율 팁 ( 점유율을 공평하게 만들자) (0) | 2015.08.18 |
자바 쓰레드 테스트 (0) | 2015.08.18 |