2011-07-03 3 views
0

공유 메모리와 연동 함수를 사용하는 시스템을 개발 중입니다.연동 함수 C++

제가 volatile unsigned int n, a, b이라고 가정합시다. 나는 다음 의사 코드를 원자 적으로하고 싶다 :

if (a <= n && n < b) 
{ 
    n++; 
} 
else 
{ 
    //Do nothing 
} 

나는 어떻게 할까? 연동 기능을 여러 개 함께 사용할 수 있습니까?

+1

다음은 시작하는 좋은 읽기입니다 : http://blogs.msdn.com/b/oldnewthing/archive/2004/ 09/15/229915.aspx – vcsjones

+3

멀티 스레딩과 관련하여 '휘발성'에 대해 알고 있다고 생각하는 모든 것을 가져 와서 버리십시오. – GManNickG

답변

5

잠금 또는 CAS 유형 작동이 필요합니다. volatile의 금액이 여기에 도움이 될 것입니다. 어느 쪽도 진정한 원자 데이터 유형은 아닙니다.

+2

CAS는 이러한 유형의 작업에 매우 적합합니다. 잘 했어. [몇 가지 예] (http://blogs.msdn.com/b/oldnewthing/archive/2004/09/15/229915.aspx)입니다. –

+0

@Ben - 흥미로운 점은 우리 모두가 The Old New Thing에 대한 링크를 게시했다는 점입니다. – vcsjones

+2

@vcs @ben 그냥 raymond를 언급하는 것은 보통 두 개의 upvotes의 가치가 있습니다. –

2

세마포어, 뮤텍스 등의 동기화 기본 요소는 언어 자체가 아닌 OS 관련 라이브러리에서 제공됩니다. C/C++에는 본질적으로 "동기화 된"키워드가 없습니다. 당신이 리눅스에서 프로그래밍하는 경우

, POSIX 쓰레드를 보면 또는 부스트 라이브러리 :

http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html

네이티브 윈도우는 Win32에서 프로그래밍하는 경우 (win98을 이상), 당신은 같은 API를 사용할 수 있습니다 다른 사람의 사이에서 EnterCriticalSection()와 InterlockedAdd는() :

http://msdn.microsoft.com/en-us/library/ms686353%28v=VS.85%29.aspx

는 닷넷과 윈도우를 프로그래밍하는 경우, 그러나, 당신은 표준의 일부가되는 동기화 기본으로 돌아왔다. 인터넷 라이브러리 : 도움이

http://msdn.microsoft.com/en-us/library/ms173179.aspx

'희망 .. PSM