c++, java, c# 스레드 예제 보면서
상호배제는 하는데 캐시단까지 신경을 쓰는건 못봐서 실문드립니다.
컴구조때 레지스터와 메모리사이에 캐시가 있고, 멀티코어 때문에 캐시 불일치가 있을 수 있잖아요.
그래서 OS나 로우레벨 단에서는 캐시 일치시키는 작업을 하잖아요
근데 언어단에서는 캐시 불일치를 신경 안써도 되나여?
아래 Java와 cpp로 2개의 스레드가 공용변수를 10씩 올리는걸 짰는데
20이 나온다는게 100%보장이 되나요?
c++, java, c# 스레드 예제 보면서
상호배제는 하는데 캐시단까지 신경을 쓰는건 못봐서 실문드립니다.
컴구조때 레지스터와 메모리사이에 캐시가 있고, 멀티코어 때문에 캐시 불일치가 있을 수 있잖아요.
그래서 OS나 로우레벨 단에서는 캐시 일치시키는 작업을 하잖아요
근데 언어단에서는 캐시 불일치를 신경 안써도 되나여?
아래 Java와 cpp로 2개의 스레드가 공용변수를 10씩 올리는걸 짰는데
20이 나온다는게 100%보장이 되나요?
volitile
그거 쓰면 뮤텍스나 모니터 안써도 되는거 같은데 맞나여??
상호배제를 안할 때 20이 안나오는건 캐시 영향도 있는데, lock 걸었으면 생각할 필요 없음
lock 안걸고 atomic으로 할거다 이러면 신경 써야됨
글군요
운에 맡기세용 - dc App
쓰기가 1개면 volatile, N개면 락걸거나 코드 구조를 바꿔서 로컬변수를 활용하는 방향으로 가야함
공유변수 쓰지않고 나중에 결과값을 모은다던지
정확히는 쓰기가 1개이고 읽기가 1개이상 있으면 volatile 써야하는거죠? 아니면 그냥 mutex나 monitor로 묶던지
맞음 읽기는 1개든 N개든 상관없음 쓰기랑 쓰레드가 다르고 W=1 면 volatile / W>1 면 lock 임
volatile 걸어도 항상 최신값은 아닐수 있긴 함. 근데 보통 delay 를 인정하는 방향으로 만들면 편함
뮤텍스 락걸고 할꺼면 상관없는데 아토믹, CAS 같은거 할려면 메모리 베리어 같은거 생각해야함
c++ 서버 현업에서는 성능 끌어올려야 하는 경우엔 캐시도 고려해서 개발함
뮤텍스 락 구현을 뜯어보면 캐시일치시키는 명령어도 씀