http://zalhae.blog.me/30151545137
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
}
---------------------------------------------------------------------
[참고]
man nanosleep;