지금 deadlock 때문에 미치겠어요 도와주세요...ㅠ.ㅠ
글쓴이: trymp / 작성시간: 월, 2014/02/10 - 7:31오후
제가 간단한 프록시 데몬을 만들어서 thread 별로 작업을 분할했습니다. (linux 환경)
A(패킷수신) -> 작업전달 -> B(내용분석) -> 작업전달 -> C(원래목적지로 전달)
대략적으로 이런식인데요, 멀티쓰래드이기에 쓰래드간에 공유영역에 대해
mutex 를 걸었습니다. critical구간도 굉장히 짧고요 (pthread_mutex_lock,pthread_mutex_unlock)
그래서 잘 도는데, 한 2 ~ 3일 돌리다보면 데드락에 빠집니다.
소스코드 뚤어져라 봐도 코드상 문제점은 잘 안보입니다.
그렇게까지 복잡한 코드도 아니고요 그래서 strace 보니 아래와 같습니다.
[pid 5391] futex(0x2ee00db8, FUTEX_WAIT, 2, NULL
[pid 5393] futex(0x80d7414, FUTEX_WAIT, 2, NULL
[pid 5394] futex(0x80d743c, FUTEX_WAIT, 2, NULL
솔직히 감이 잘 안오고요
다만 좀 이상한점은 futex 가 원래 이미 lock 잡혀 있으면 대기큐에 들어가는 녀석인데,
첫인자 address 가 이상한 값입니다.
딴 것들은 0x800xxx 이렇게 가는데, 첫번째 스래드가 0x2ee00db8 라는 주소를 검사하고 있네요?
이것 혹시 메모리가 깨진 걸 까요? 아님 저 주소도 정상적인 주소일까요?
몇일째 고생입니다. 고수님들 좀 도와주세요..
Forums:
futex가 무엇인지는 모르겠지만, mutex를 써서
futex가 무엇인지는 모르겠지만, mutex를 써서 구현하셨다면 mutex를 에러검출 mutex(PTHREAD_MUTEX_ERRORCHECK)를 만들고
pthread_mutex_lock의 리턴값을 검사해서 EDEADLK이 리턴되면 thread 아이디와 라인번호를 찍으시고, 마찬가지로 mutex로 보호되는 영역 안쪽에도 thread 아이디와 라인번호를
찍으면 원인이 잡히지 않을까 합니다.
Signature :) - "여유를 갖고 행동하되 게을러지지 말자"
댓글 달기