세마포어 카운트
글쓴이: purewell / 작성시간: 화, 2004/11/16 - 12:19오후
typedef unsigned char bool; enum {false = 0, true = 1}; typedef union SEMUNI { int val; struct semid_ds* buf; unsigned short* array; struct seminfo* __buf; } SEMUNI, *PSEMUNI; bool CreateSEM(int* pSem, int nKey, int nMax) { int sem; sem = semget(nKey, nMax, 0777|IPC_CREAT); if ( sem == -1 ) return false; static SEMUNI semuni = { val: nMax }; semctl(sem, 0, SETVAL, semuni); *pSem = sem; return true; } bool RemoveSEM(int hSem) { static SEMUNI semuni; return ( -1 != semctl(hSem, 1, IPC_RMID, semuni) ); } bool UnlockSEM(int hSem) { static struct sembuf sb = { sem_num:0, sem_p:+1, sem_flg:SEM_UNDO }; return ( -1 != semop(hSem, &sb, 1) ); } bool LockSEM(int hSem) { static struct sembuf sb = { sem_num:0, sem_p:-1, sem_flg:SEM_UNDO }; return ( -1 != semop(hSem, &sb, 1) ); }
이렇게 인터패이스를 짰습니다.
int main(int argc, char* argv[]) { int sem; size_t i, max; CreateSEM(&sem, 9898, 2); /* 성공 */ /* SECTION 1 */ for ( i = 0, max = 2; i < max; i ++ ) { LockSEM(sem); } /* SECTION 2 */ for ( i = 0, max = 3; i < max; i++ ) { UnlockSEM(sem); } /* SECTION 3 */ for ( i = 0, max = 3; i < max; i++ ) { LockSEM(sem); } return EXIT_SUCCESS; }
위와 같은 코드가 있습니다.
SECTION 1에서 max가 3이면 마지막 LockSEM에서 당연히
프로세스가 블로킹 됩니다. 물론 블로킹 안 되게 max가 2이지만...
SECTION 2에서 max가 3이며 세마포어 객체를 만들 때
최대값 2보다 많습니다. UnlockSEM은 i가 0에서 2까지 모두
true를 반환합니다.
SECTION 3에서 max가 3이며 세마포어 객체를 만들 때
최대값 2보다 많습니다. LockSEM은 i가 0에서 2까지 모두
true를 반환하며 i가 2일 때 블로킹되지 않습니다.
ㅡ,.-) 이 일이 어찌된 것이옵니까?
Forums:
Lock 개념을 거꾸로 알고 있는듯합니다.
Lock 개념을 거꾸로 알고 있는듯합니다.
----------------------------------------------------------------------------
댓글 달기