세마포어 카운트

purewell의 이미지

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일 때 블로킹되지 않습니다.

ㅡ,.-) 이 일이 어찌된 것이옵니까?

ㅡ,.ㅡ;;의 이미지

Lock 개념을 거꾸로 알고 있는듯합니다.


----------------------------------------------------------------------------