[진행중]Thread 프로그램 중 (Linux C) deadlock 발생 질문입니다. __lll_mutex_lock_wait()

seo5273의 이미지

안녕하세요..

쓰레드 프로그램 중 아래와 같이 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

seo5273의 이미지

여러가지 시도를 하고 있는 데 아직 원인을 모르겠네요..ㅠㅠ

휴 덥다

grassman의 이미지

http://kldp.org/node/81106

localtime의 recursive 버전인 localtime_r을 써야할 것 같습니다.

lnsium의 이미지

malloc/free 중 signal이 발생했을 때,
signal handler에서 malloc/free를 사용하면 deadlock에 걸립니다.
signal을 처리하는 별도의 쓰레드를 만드는 것이 한 방법 같습니다.

행인의 이미지

혹시 이 문제는 원인파악이 명확히 되었나요???

jeremyko의 이미지

shint의 이미지

//원인
- 메모리 접근 및 할당 (시스템 가상 메모리 / 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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.