'programming'에 해당되는 글 387건

  1. 2017.11.08 SunOS에서 usleep() 문제 관련

반응형

 

SunOS의 경우 multi-thread 프로그램에서 usleep()을 빈번히 사용할 경우 프로그램이 멈출 수 있는 구조적 문제가 있습니다.
SIGALRM 이 발생되는데, 그렇다고 SIGALRM을 무시하면 실제로 해당 시그널이 필요한 순간 못쓰게 되는 문제가 있습니다.
또한 SIGALRM 뿐만 아니라 hang과 비슷한 상황도 발생될 수 있습니다.

다른 레퍼런스 사이트에서는 nanosleep()이 안전하기 때문에 usleep()을 대체하여 사용할수 있다고 하고 있으나, 
실제 악조건을 만들어서 테스트한 결과 Linux, AIX, HP-UX에서는 문제가 발생되지 않았고,
SunOS에서는 nanosleep()도 문제가 있었습니다.

이에 대하여 아래와 같이 usleep() 함수를 사용하시면 문제를 회피할 수 있습니다.

#define _SUN_MACHINE

...

int safe_usleep(unsigned int nsec)
{
#ifdef _SUN_MACHINE
    struct timeval tv = { 0, nsec };
    return select(0, NULL, NULL, NULL, &tv);
#else
    return usleep(nsec);
#endif
반응형
Posted by 공간사랑
,