[질문] 쓰레드 usleep문제...
글쓴이: angra / 작성시간: 토, 2004/12/18 - 3:50오후
CPU 23개가 있는 서버에서 쓰레드를 72개정도 만들어서 돌립니다. 일반적인 처리 상황에서는 아무 문제없이 잘 처리됩니다. 문제는 이 프로세스가 외부로부터 명령을 받아서 각 쓰레드에게 hold하라는 명령을 보냅니다. 명령을 받은 각 쓰레드들은 usleep(100000)으로 유휴 상태에 있으면서 usleep에서 빠져나온 순간 restart명령이 도착했는지 검사하고 명령이 없으면 usleep상태로 들어가고 그렇지 않으면 그 usleep상황에서 빠져나옵니다.
문제는 hold명령을 내리고 한 10분정도 있다가 살리면 쓰레드들이 잘 살아납니다. 하지만 1시간 반정도 usleep상태에 있다가 restart명령을 주니까 21개의 쓰레드들이 정상 상태로 돌아오지를 못하네요. 혹시 이런 상황을 만나신 분들이 있나요? 이런 상황에서는 어떻게 해결을 해야하나요?
제가 사용하고 있는 서버는 AIX 5.x 입니다. 시스템 버그로 봐야하나요? 아니면 쓰레드들을 hold/restart 시키는 방법을 바꿔야하나요? 현재는 그냥 flag를 하나 두고 그 값 설정 상태에 따라서 행동합니다.
Forums:
Re: [질문] 쓰레드 usleep문제...
1시간 반후에 해당 flag를 읽으면 hold된 것으로 나와서
스레드가 restart되지 않는건가요?
아니면 아예 thread가 sleep상태에서 안 깨어나서그런건가요?
간단히 진행시간을 비교해서 1시간 반후 정도에 flag를 폴링하는 경우에는 그 값을 찍어보도록 해 보시는 건 어떨까요? 스레드 번호하고요.
(디버깅 메시지가 수행결과를 바꿀 위험은 있겠네요.)
음.. 혹시 그 flag에 volatile 속성이 부여되어있나요?
Re: [질문] 쓰레드 usleep문제...
현재 메인에서 sleep명령을 보내면 각 쓰레드들이 그 명령을 받아서 sleep 처리하는 형식입니다. restart 명령을 보내면 쓰레드들이 flag를 보고 깨어나자마자 바로 데이터베이스에 깨어난 시간을 업데이트하고 다른 작업을 수행합니다. 근데 쓰레드들이 명령을 받아서 sleep 상태에서 안깨어나는 상태에 있는것들이 21개나 된다는거죠.
flag는 그냥 전역변수입니다. 쓰레드함수에서 주기적으로 체크됩니다. flag는 각 쓰레드마다 할당되고 쓰레드는 read-only로 동작합니다. volatile이란 무슨 뜻인가 잘 모르겠습니다. :oops:
volatile이란? 우린 가끔씩 코드로 얘기합니다.[code:1
volatile이란?
우린 가끔씩 코드로 얘기합니다.
* 가정
- 위 코드를 test.c로 저장했다.
1) 첫번째 시도
결론 : 잘되네.
2) 두번째 시도
코드 옵티마이즈 옵션 O2 를 주었다.(이번 기회에 옵티마이즈 옵션좀 보자!)
결론 : 잘안되네???????? 왜 안끝나지?
3) 세번째 시도
volatile?!!!!
코드에서
int *flag = (int *)pFlag; //여기가 문제다!!!!!!!!
을 다음과 같이 바꾼다.
volatile int *flag = (int *)pFlag; //여기가 문제다!!!!!!!!
되네
되네..
4) volatile과 코드 옵티마이즈의 관계는 도대체 뭐지?
* 아마도 명시적으로 컴파일러에게 해당 변수가 들어간 문장을 옵티마이즈 하지 말라는......
* 어셈블리 코드를 만들어서, 읽어 보면 명확한 증거를......
일반적으로 레지스터를 이용하는게 빠르다고 가정하고최적화 과정에서
일반적으로 레지스터를 이용하는게 빠르다고 가정하고
최적화 과정에서 변수를 레지스터에 올리게 될 수 있습니다.
레지스터에 올라간 변수는 필요에 따라 변경될 수 있기 때문에
무조건 메모리에 올리라는 뜻으로 volatile를 붙여줍니다.
최적화 한답시고 건드리지 말아라~ 하는 뜻이죠.
반대로 이건 레지스터에 올렸으면 좋겠다(컴파일러 마음)면 register를 붙이죠.
이런 문제가 있는 코드는 -Wall옵션을 붙이면 경고가 뿌려지기도 합니다.
그럼...!
Re: [질문] 쓰레드 usleep문제...
부럽다는.... CPU 2개짜리 PC도 없음.
시나리오일뿐. 디버깅 데이터로 부족함
음, 데이터 부족입니다.
Solaris의 경우 usleep는 thread safe 함수가 아닙니다
Solaris의 경우 usleep는 thread safe 함수가 아닙니다.
해당 OS의 경우 어떤지는 모르겠지만 thread safe상태를 조사해 보세요.
Re: [질문] 쓰레드 usleep문제...
일단 스레드가 죽었는지 살았는지 테스트 코드를 한번 넣어보
세요. 간단히 5부마다 뭘 출력한는 코드같은거요.
말씀해주신 사항만으로는 원인을 짐작할수 없지만.. 다른분들이
말씀하신것처럼 스레드간 통신방법이 좀 맘에 걸리긴 하네요..
각 스레드마다 전역변수를 두고 이를 스레드끼리 공유하는것보다는
임계영역, 뮤텍스 같은 동기화로 보호된 메세지큐를 두어 통신하는
방법이 더 세련되지 않을까 합니다.
댓글 달기