pthread_mutex_lock / pthread_mutex_unlock 에 대한 질문 입니다.

hyper9의 이미지


아직 원인을 몰라서 계속 헤매고 있는 중이었는데요 ,,

갑자기 궁금해진것은,,

예를 들어 어떤 이유로 인해 pthread_mutex_lock과 pthread_mutex_unlock 이 쌍으로 잘
맞아 돌아가지 않으면 hang이 걸리지 않을까 하는 생각이 들었어요 ..
(에고,,제가 이 multi thread환경 debugging은 경험이 많지 않네요 ㅜㅜ)

이런 경우에 모든 thread 들이 언제 pthread_mutex_lock을 걸었고, 언제 pthread_mutex_unlock
을 하는지 이게 잘 되고 있는건지를 debugging해보려면 어떻게 해야할까요?
눈만 부릅뜨고 보는걸로는 좀 한계가 있을 것 같은데,,어떤 방법을 쓰면 되는지 여쭤보고 싶어서요.

그리고 지금 이 문제가 있는 program이 single core CPU 만 있는 system 에서도 잘 돌고,
또 hyper threading이 enable되어 있는 2개의 CPU가 설치되어 있는 system에서도 잘 돌거든요.
그런데 QuadCore CPU 2개가 설치되어 있는 System에서는 계속 문제가 보여요

이 문제가 이런 mutex관리가 잘못되어서 (표현이 맞는지 모르겠네요.)
생기는 거라고 추측을 하고 있는데,,제가 엉뚱하게 추측을 하고 있는거라면 조언 부탁드립니다.

gdb로 쫓아가보면,,hang이 걸리는 곳에서

0xb7b809fb in __lll_mutex_lock_wait () from /lib/libc.so.6
(gdb) si
0xb7b809fd in __lll_mutex_lock_wait () from /lib/libc.so.6
(gdb) si
0xb7b809ff in __lll_mutex_lock_wait () from /lib/libc.so.6
(gdb) si
0xb7b809f2 in __lll_mutex_lock_wait () from /lib/libc.so.6

이렇게 계속 반복되고 있는데 이게 hang이 걸리는 원인인 것 처럼 보여서요 ..

그럼 조언 부탁드립니당 ~

pizza1977의 이미지

pthread_mutex_t 타입의 핸들이 각각의 쓰레드에서 유효한지 확인해 보시죠?

쓰레드, 프로세스간 동기화 문제는 디버깅도 중요하지만 논리적으로 접근해 보는게
더 많은 도움을 줄 때가 있습니다.

포탈이는 불사신

-------------
포탈이는 불사신

a287848의 이미지

저같은면 pthread_mutex_lock 함수와 unlock 함수를 덮는 함수를 하나더 만든 다음에

그 안에 다음과 같이 넣겠습니다.

int my_pthread_mutex_lock(...){
printf("thread id: %d , file_name: %s, function_name: %s, line number: %d\n", 쓰레드 아이디, __FILE__, __FUNCTION__, __LINE__);
pthread_mutex_lock() 본래 함수 호출
}

이런식으로 unlock 쪽에도 capsulation 함수를 만든 다음에

실행시키실때 파일이름 > result.txt 이렇게 뽑아서

하나하나 확인해봐야죠.

저는 arm기반 메모리 디버거가 마땅히 없어서 memory leak 찾아낼때 이렇게 했었습니다.

Dig it.

Dig it.

pizza1977의 이미지

printf와 lock문 사이에 스위칭이 발생하는 경우....아 너무 트집인가요? ㅡㅡ

포탈이는 불사신

-------------
포탈이는 불사신

kuma의 이미지

Lock 후 printf 를 사용하면 어떨까요?

hyper9의 이미지

제 Application에서도 pthread_mutex_lock/pthread_mutex_unlock
을 부르지만,,다른 library에서도 많이 부르는 것 같은데요..

그건 어떻게 살펴볼 수 있을까요?
Library에 wrapping function을 넣는 것이 좋을까요? ~

a287848의 이미지

좋은 지적이십니다.

글쓴분이 이야기 하셨지만

Quote:
언제 pthread_mutex_unlock을 하는지

는 조금 값이 틀리겠지만

Quote:

이게 잘 되고 있는건지를 debugging해보시는것

을 횟수로 찾는 문제라면 프로그램 runtime만 길게 잡으신다면 별문제 없어보입니다.

Dig it.

Dig it.

pizza1977의 이미지

pthread_mutex_lock();
printf("in threadid...");
processing...
printf("out threadid...");
pthread_mutex_unlock();

포탈이는 불사신

-------------
포탈이는 불사신

hyper9의 이미지

아래의 ___lll_mutex_lock_wait는 이 thread가 mutex lock
을 기다리면서 hang이 걸린게 맞나요?

자세히 모르겠지만,,,웬지 __lll_mutex_lock_wait 라는 이름이
주는 느낌이 그래서요.

그러면,,어딘가서 lock이 걸리지도 않았는데,,unlock을 하려고 하는
곳이 있다고 가정할 수 있는 걸까요?

0xb7b809fb in __lll_mutex_lock_wait () from /lib/libc.so.6
(gdb) si
0xb7b809fd in __lll_mutex_lock_wait () from /lib/libc.so.6
(gdb) si
0xb7b809ff in __lll_mutex_lock_wait () from /lib/libc.so.6
(gdb) si
0xb7b809f2 in __lll_mutex_lock_wait () from /lib/libc.so.6

만일 지금 제 가정이 틀리는 거라면,,어떤 가정을 하는게 맞는걸까요?
역시 또 조언을 부탁드립니다. ^^

hyper9의 이미지

gdb에서 pthread_mutex_lock과 pthread_mutex_unlock에
breakpoint를 걸고 들여다 보는 중인데요 ,,

아래와 같은 내용이 display되는 경우도 있던데,,
_L_mutex_lock_79는 어떤 뜻인지요?

(gdb)
[Switching to Thread -1257112688 (LWP 3080)]
0xb7c095d5 in _L_mutex_lock_79 () from /lib/libpthread.so.0
(gdb)
Single stepping until exit from function _L_mutex_lock_79,
which has no line number information.
[Switching to Thread -1290667120 (LWP 3084)]

pizza1977의 이미지

제가 잘 몰라서 그럴 수도 있지만 gdb는 무리가 있습니다.
내용을 보니 어떤 함수에서 문제가 발생하는지 확인 하신것 같은데

해당 함수를 한번 올려 보시지요.

포탈이는 불사신

-------------
포탈이는 불사신

hyper9의 이미지

사실은 얼마전에 libxml2문제라고 글을 올린적이 있었거든요..

제가 libxml2 library중에서

xmlFree() function을 부르면 바로 hang이 됩니다.
그런데 이것이 single core system에서는
발생하지 않고요,
또 2개의 CPU (single core)를 쓸때까지도 발생하지 않았는데
2개의 Quad Core CPU를 사용하니까,,발생하네요 ..

한 1주일째 여기저기 보면서 궁리를 했는데,,지금 제일 의심을
하고 있는 부분이 thread 간의 동기화문제(?) 같은게 아닐까
생각하고 있었어요..

pizza1977의 이미지

요거군요... 3년 전쯤에 씨름했던 기억이 있긴 있는데...
소스 컴파일 해서 사용하신건가요? 아니면 패키지?

소스면 xmlMemFree 던가...
xmlFree가 단순한 함수가 아닌걸로 알고 있는데요.
함수 포인터이고 위에 말한 xmlMemFree 인가 암튼
관련 함수가 있을겁니다. 소스 좀 보셔야 되겠네요 ㅎㅎ

참고로 그닥 libxml2는...하긴 마땅히 쓸게 없죠

apache xml과 libxml2 중에 libxml2 썼다가 개피봤는데 ㅡㅡ

포탈이는 불사신

-------------
포탈이는 불사신

hyper9의 이미지

처음에는 그냥 package를 install해서 썼었는데,,
혹시 package에 bug가 있을지도 모르고 해서
package를 upgrade하면서는 source RPM을 설치해 놓고
compile해가며 보고 있답니다..

예,,,xmlFree가 함수가 아니고,,
xmlMemFree 또는 free 둘중의 하나로 mapping이 되게 되어 있더군요.

지금 제가 쓰는 library에서는 free로 mapping이 되게 되어 있고요.
예를 들어 강제로 DEBUG_MEMORY_LOCATION flag를 enable해서
compile을 하면 이 문제가 없어집니다.

하지만,,다른 곳에서 error가 나더군요..
다른 곳이라하면 calloc()을 할때 꼭 error가 났던 것 같아요.

그래서 지금은 다시 xmlFree를 free로 돌려놓고 보고 있는 중입니다.

경험하셨던 기억을 살려서 조언을 주시면 감사하겠습니당 ^^

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.