검색 여닫기
검색
메뉴 여닫기
537
245
4
2.1천
noriwiki
둘러보기
대문
최근 바뀜
임의의 문서로
미디어위키 도움말
특수 문서 목록
파일 올리기
환경 설정 메뉴 여닫기
notifications
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
user-interface-preferences
한국어
개인 도구
로그인
Test and test and set 문서 원본 보기
noriwiki
문서 공유하기
다른 명령
←
Test and test and set
문서 편집 권한이 없습니다. 다음 이유를 확인해주세요:
요청한 명령은 다음 권한을 가진 사용자에게 제한됩니다:
사용자
.
문서의 원본을 보거나 복사할 수 있습니다.
[[분류: 동시성 프로그래밍]] == 개요 == test and test and set은 기존 [[Test and set]]의 단점을 극복하기 위해서 만들어졌다. 모든 test_and_set은 기존의 val값이 무었이든 상관없이 cache line invalidation을 요구한다. 이는 [[Multicore]]환경에서 performance저하를 일으켜서 Scalability을 저하시킨다. 이 문제를 해결하기 위해서 Test and test and set은 우선 set없는 test를 수행하여 변수를 확인하고 특정조건에서만 test and set을 요구한다. <syntaxhighlight lang=c> class TasSpinLock { public: ALWAYS_INLINE void Enter() { // atomic_bool::exchange() returns previous value of Locked while (Locked.exchange(true, std::memory_order_acquire) == true); } ALWAYS_INLINE void Leave() { Locked.store(false, std::memory_order_release); } private: alignas(CACHELINE_SIZE) std::atomic_bool Locked = {false}; }; static_assert(sizeof(TasSpinLock) == CACHELINE_SIZE, ""); </syntaxhighlight> == 단점 == # [[Thundering Herd]]문제가 역시 발생한다. 이 문제를 해결하고자 임의의 (혹은 여러 파라미터로 결정되는 시간의) backoff즉 지연을 주어서 각 스레드가 특정한 지연뒤에 TTAS를 실행시키도록 하는 방법도 있다. 이 방식을 TATAS with exponential backoff라고 한다. == 참고 == # https://geidav.wordpress.com/tag/test-and-test-and-set/
Test and test and set
문서로 돌아갑니다.