[진행중]Thread 프로그램 중 (Linux C) deadlock 발생 질문입니다. __lll_mutex_lock_wait()
안녕하세요..
쓰레드 프로그램 중 아래와 같이 lock 이 발생 합니다.
두개의 쓰레드가 모두 __lll_mutex_lock_wait()에서 멈춰 있는 데요.
여기 저기 찾아 보니 localtime 에 signal 이 발생 되면 그런다는 얘기도 있긴 한데..
두개의 lock 되는 부분을 살펴보니 그런것 같지는 않습니다.
thread 1 번은 main 이며
thread 2 번은 localtime 을 호출 하면서 lcok 이 걸렸구요
thread 3 번은 fopen 을 하면서 lock 이 걸렸습니다.
발생 되는 시점은 로그 파일의 날짜가 바뀌면서 새로운 로그파일을 생성 하면서 발생 되는 것 같습니다.
(1개월 동안 2번 발생. 00시를 넘어 가면서 발생됨)
OS는 리눅스 64bit 입니다.
간단하게 위와 같은 상황(thread 1은 localtime, thread 2는 fopen 만 while 루프로 호출)의 프로그램을 만들어서 테스트를 해 봤는 데..
이상하게도 재현해 보고 싶은 데서는 안걸리고 printf 에 lock 이 발생 되네요..
이것 저것 해 봤는 데 잘 모르겠습니다.
혹시 이런 경험을 해 보신 분이나 원인을 아시는 분은 답변 좀 부탁 드립니다.
감사 합니다.
(gdb) info threads
* 3 Thread 1115842880 (LWP 17719) 0x0000003a568dd918 in __lll_mutex_lock_wait () from /lib64/libc.so.6
2 Thread 1126332736 (LWP 17720) 0x0000003a568dd918 in __lll_mutex_lock_wait () from /lib64/libc.so.6
1 Thread 47439585491728 (LWP 17580) 0x0000003a56898341 in nanosleep () from /lib64/libc.so.6
(gdb) thread 1
[Switching to thread 1 (Thread 47439585491728 (LWP 17580))]#0 0x0000003a56898341 in nanosleep () from /lib64/libc.so.6
(gdb) where
#0 0x0000003a56898341 in nanosleep () from /lib64/libc.so.6
#1 0x0000003a568cb854 in usleep () from /lib64/libc.so.6
#2 0x000000000040c324 in main (argc=, argv=0x669508) at sms_agent.c:3230
(gdb) thread 2
[Switching to thread 2 (Thread 1126332736 (LWP 17720))]#0 0x0000003a568dd918 in __lll_mutex_lock_wait ()
from /lib64/libc.so.6
(gdb) where
#0 0x0000003a568dd918 in __lll_mutex_lock_wait () from /lib64/libc.so.6
#1 0x0000003a5688b33d in _L_lock_1685 () from /lib64/libc.so.6
#2 0x0000003a5688b087 in __tz_convert () from /lib64/libc.so.6
#3 0x0000000000406ba2 in print_header_send (tid=1, m=0x43226630) at sms_agent.c:598 <====== localtime(&now)
#4 0x0000000000406fa9 in gip_send_req_link (tid=1, t=0x43227090, code=, subcode=)
at sms_agent.c:1398
#5 0x0000000000407c38 in OneTym (tid=1, t=0x43227090, now=1249316314) at sms_agent.c:2349
#6 0x000000000040a240 in worker_thread (param=) at sms_agent.c:2997
#7 0x0000003a574062f7 in start_thread () from /lib64/libpthread.so.0
#8 0x0000003a568d1b6d in clone () from /lib64/libc.so.6
(gdb) thread 3
[Switching to thread 3 (Thread 1115842880 (LWP 17719))]#0 0x0000003a568dd918 in __lll_mutex_lock_wait ()
from /lib64/libc.so.6
(gdb) where
#0 0x0000003a568dd918 in __lll_mutex_lock_wait () from /lib64/libc.so.6
#1 0x0000003a56875e17 in _L_lock_14090 () from /lib64/libc.so.6
#2 0x0000003a56874c51 in free () from /lib64/libc.so.6
#3 0x0000003a5688a93a in tzset_internal () from /lib64/libc.so.6
#4 0x0000003a5688b270 in tzset () from /lib64/libc.so.6
#5 0x0000003a5688fb94 in strftime_l () from /lib64/libc.so.6
#6 0x0000003a568ce181 in __vsyslog_chk () from /lib64/libc.so.6
#7 0x0000003a5686a2d0 in __libc_message () from /lib64/libc.so.6
#8 0x0000003a56871cd1 in _int_malloc () from /lib64/libc.so.6
#9 0x0000003a56872e8d in malloc () from /lib64/libc.so.6
#10 0x0000003a5686124a in __fopen_internal () from /lib64/libc.so.6
#11 0x00000000004103f2 in _WriteLog (szPath=0x658c80 "/app/mpomr/log/sms_agent/sms_agent_charge_1", nLevel=6,
szFmt=0x449ab8 "[%s][%05d:%02d][%s_%02d][%s][%s][%d] - [%s]\n", argptr=0x42825710) at ua_mts_dprintf.c:73 <====== LibSys.fp = fopen(szFilename, "a+");
#12 0x0000000000410622 in uaprintf (nLevel=6, szFmt=0x449ab8 "[%s][%05d:%02d][%s_%02d][%s][%s][%d] - [%s]\n")
at ua_mts_dprintf.c:122
#13 0x0000000000403f3d in print_start (tid=-16843009) at sms_agent.c:207
#14 0x0000000000409cf6 in send_sms (tid=0, t=0x42826090, q_idx=) at sms_agent.c:1680
#15 0x000000000040a3c8 in worker_thread (param=) at sms_agent.c:2982
#16 0x0000003a574062f7 in start_thread () from /lib64/libpthread.so.0
#17 0x0000003a568d1b6d in clone () from /lib64/libc.so.6
이거 아직 해결이 안됐습니다..
여러가지 시도를 하고 있는 데 아직 원인을 모르겠네요..ㅠㅠ
휴 덥다
localtime() 함수가 thread-safe하지 않다는군요.
http://kldp.org/node/81106
localtime의 recursive 버전인 localtime_r을 써야할 것 같습니다.
malloc deadlock입니다.
malloc/free 중 signal이 발생했을 때,
signal handler에서 malloc/free를 사용하면 deadlock에 걸립니다.
signal을 처리하는 별도의 쓰레드를 만드는 것이 한 방법 같습니다.
혹시 확인 되었나요?
혹시 이 문제는 원인파악이 명확히 되었나요???
혹시 도움이 될지도
http://jeremyko.blogspot.kr/2017/12/localtimer-thread-safe-deadlock.html
비슷한 경우라면 다행이겠네요.
참고해보세요.
//원인
- 메모리 접근 및 할당 (시스템 가상 메모리 / Swap 메모리 용량 포함)
- 코드 오류 (순서 / 중복 / 인자값 / 리턴값)
- 기타 ?? : 빌드 오류 / 라이브러리 참조 오류 / 32비트 64비트 / 경로 오류 / 버전 문제
//방안
잘 되는 책 예제 혹은 사이트 예제 등을 참고해보세요.
__lll_mutex_lock_wait ()
http://comp.os.linux.development.apps.narkive.com/7AxnPXaO/lll-mutex-lock-wait
Reload this Page A process is hanging with debug message __lll_mutex_lock_wait () when dlopen() called
https://www.linuxquestions.org/questions/programming-9/a-process-is-hanging-with-debug-message-__lll_mutex_lock_wait-when-dlopen-called-617126/
__lll_mutex_lock_wait ()
https://bytes.com/topic/c/answers/135311-__lll_mutex_lock_wait
Mutex Lock Code Examples
https://docs.oracle.com/cd/E19455-01/806-5257/sync-12/index.html
Linux Kernel: Deadlocks and how to avoid them
http://cmdlinelinux.blogspot.com/2014/01/linux-kernel-deadlocks-and-how-to-avoid.html
Deadlock creation and avoidence in pthreads
http://tuxthink.blogspot.com/2012/12/deadlock-creation-and-avoidence-in.html
simple deadlock example using pthread
https://stackoverflow.com/questions/27480125/simple-deadlock-example-using-pthread
Linux System Programming: Talking Directly to the Kernel and C Library
https://books.google.co.kr/books?id=LOeK6EZfiH0C&pg=PT311&lpg=PT311&dq=Linux+C)+deadlock&source=bl&ots=HcilHDSxC6&sig=mf3T-JecOVrlBsUv6VNGvV-o1o8&hl=ko&sa=X&ved=2ahUKEwjZpufx_MbdAhWGS7wKHa7BBucQ6AEwB3oECAUQAQ#v=onepage&q=Linux%20C)%20deadlock&f=false
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기