2013-01-16 7 views
1

SYS V 세마포어를 사용해야하는 프로젝트가 있습니다.여러 프로세스에서 사용하는 SYS V 세마포를 올바르게 제거합니다.

bool semaphore_init(semaphore_id_t* sem, int sem_value, key_t key) 
{ 
    /* Try to get a semaphore, to check if you will be an owner */ 
    *sem = semget(key, 1, IPC_CREAT | IPC_EXCL | 0666); 
    if (*sem == -1) 
    { 
     if (errno == EEXIST) 
     { 
      /* We are not owners, get semaphore without exclusive flag */ 
      *sem = semget(key, 1, IPC_CREAT | 0666); 
      if (*sem == -1) return false; 
     } 
     else return false; 
    } 
    else 
    { 
     /* We are owners, initialize semaphore */ 
     int return_value = semctl(*sem , 0, SETVAL, sem_value); 
     if (return_value == -1) return false; 
    } 

    return true; 
} 

내 문제는 다음과 같습니다 : 나는 세마포어 (동일한 키를 사용)를 공유하고이 코드로 초기화하는 여러 프로세스를 가지고 내가이 세마포어를 제거 할 때 종료됩니다 사용하는 모든 프로세스. 사용 :

semctl(*sem, 0, IPC_RMID) 

은 선택할 수 없습니다. 즉시 세마포어를 삭제하고 다른 프로세스는 정의되지 않은 동작을 갖습니다. SYS V API로 올바른 방법을 찾을 수 없습니다.

답변

0

참조 횟수를 사용할 수 있습니다. 각 프로세스가 세마포어 초기화 후에 ref 카운터를 증가시키고 프로세스가 종료 될 때 감소시킵니다. 마지막으로 0으로 감소 시키면 다른 프로세스가 모두 종료되었음을 알 때이를 제거하거나 기본 프로세스에서 제거합니다.

참조 카운터에 대한 액세스를 동기화하는 또 다른 잠금 메커니즘이 필요합니다. 다른 프로세스를 생성하고 기다리는 주 프로세스에서 생성/제거 할 수 있습니다.

또한 프로세스가 비정상적으로 종료 될 수있는 경우 참조가 매달 리도록주의하십시오.

+0

문제는 라이브러리가 분산되어 있다는 것입니다. 당신이 말했듯이 참조 카운팅을 위해 다른 세마포어를 사용해야 할 것입니다. 그러나 누가 그것을 풀 것인가? –