2012-10-02 2 views
1

공유 메모리에 뮤텍스를 만드는 간단한 작업을 시도하고 있습니다. 다음 코드는 공유 메모리 섹션을 선언하고 int*에 연결합니다.공유 메모리에서 뮤텍스 관리하기

int *mutex; 

// allocate shared memory for mutex 
if ((shmid2 = shmget(IPC_PRIVATE, 4, IPC_CREAT | 0666)) < 0) { 
    printf("Could not allocate shared memory for mutex: %d.\n", errno); 
    exit(errno); 
} 

if ((mutex = shmat(shmid2, NULL, 0)) == (int*)-1) { 
    printf("Could not attach shared memory for mutex: %d\n", errno); 
    exit(errno); 
} 

// set the mutex to one 
mutex[0] = 1; 

이제 뮤텍스 잠금 및 잠금 해제로 둘러싸인 중요한 섹션을 정의하려고합니다. (많은 자식 프로세스 중 하나의 내부).

while (*mutex == 0) ; 
mutex[0] = 0; 

// critical section 

... 

// end critical section 

mutex[0] = 1; 

그러나, 나는이 기술이 작동하지 않습니다 찾는거야, 그리고 두 개의 자식 프로세스 (매우 자주 발생합니다) 많은 문제없이 동시에 임계 영역을 입력 할 수 있습니다. 그래서 pthreads를 사용하지 않고이 문제를 해결하기 위해 내가 할 수있는 일이 궁금합니다.

+0

pthread를 사용하지 않으려는 이유가 있습니까? –

답변

5

옵션은 다음과 같습니다 대신 공유 메모리 스핀 락과 함께 그들에게 자신을 구현하기 위해 노력

  1. 사용 POSIX 세마포어. 자세한 내용은 semop (2) 설명서 및 관련 기능을 참조하십시오.

  2. 공유 메모리 세마포를 사용해야하는 경우 원자 비교/교환을 사용해야합니다. 그렇지 않으면 두 프로세스가 동시에 *mutex == 0을보고 다른 프로세스가 동일한 작업을 수행하고 있다는 것을 "알지"않고 1으로 동시에 설정할 수 있습니다.

관련 문제