세마포어 카운트
글쓴이: 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 개념을 거꾸로 알고 있는듯합니다.
----------------------------------------------------------------------------
댓글 달기