문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 뮤텍스 (문단 편집) === 참고: 원자적 연산(atomic operation) === 보통 뮤텍스, [[세마포어]] 등의 상호배제 연산은 입장 구역에서 진입 가능 여부를 판단하고, 진입이 불가능하면 현재 임계 영역을 수행중인 스레드에게 CPU를 넘겨주는 등의 기능을 내부적으로 처리하기 때문에 상당히 복잡하게 구현되어 있고 수행하는데 시간이 오래 걸린다.[* 프로그래머들은 보통 '''무겁다'''라는 은어를 사용한다. 영어 heavy, light 등에서 직역된 표현.] 만일 임계 영역 내부에서 변수 하나를 증가시키는 기능만을 수행하기 위해 뮤텍스를 사용한다면 배보다 배꼽이 더 큰 상황이 발생하게 된다. 이를 위해 [[CPU]]에서 적은 수의 연산에 한해서 임계구역을 설정한 것처럼 작동하는 기능을 지원하는데 이를 원자적 연산(atomic operation)이라고 한다. 문맥전환이 필요없기 때문에 뮤텍스를 사용했을 때에 비해 매우 빠르게(즉 ''''가볍게'''') 작동한다. X86 계열의 CPU라면 어셈블리 명령어 앞에 lock이 붙어 있는 것들이 원자적 연산이다. 대체적으로 compare-and-swap, fetch-and-add 등에 atomic operation을 활용한다. 물론 일반적인 [[메모리]] 읽기/쓰기 명령에 비해서는 느리기 때문에 남용하거나 필요없는 부분에 사용하면 시스템 전체의 성능저하를 불러온다. 동일한 스레드를 여러 개 시작하고 종료할 때 현재 스레드가 몇 개 작동중인지 알아내고 싶다면 뮤텍스, 혹은 원자적 연산을 사용해 아래와 같이 만들 수 있다. 뮤텍스를 사용한 예제. {{{#!syntax cpp int gNoThreads = 0; mutex gLock; int threadfunc(void* pParam) { /* 시작하면서 스레드 개수를 늘려준다. */ lock(gLock); gNoThreads++; unlock(gLock); /* thread run */ /* 종료하면서 스레드 개수를 감소시킨다. */ lock(gLock); gNoThreads--; unlock(gLock); return 0; } }}} 원자적 연산을 사용한 예제. - [[GCC]]의 [[컴파일러|인트린식 사용]] {{{#!syntax cpp int gNoThreads = 0; int threadfunc(void* pParam) { /* 시작하면서 스레드 개수를 늘려준다. */ (void)__sync_add_and_fetch(&gNoThreads, 1); /* thread run */ /* 종료하면서 스레드 개수를 감소시킨다. */ (void)__sync_sub_and_fetch(&gNoThreads, 1); return 0; } }}} 원자적 연산을 큰 덩어리의 메모리에 수행하는 것을 보통 트랜잭셔널 메모리(Transactional Memory)라고 한다. [[인텔]] [[하스웰]] 이상의 CPU에서 제공하는 'RTM'과 [[PowerPC]]에서 제공하는 'HTM'이 트랜잭셔널 메모리이다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기