thread 질문입니다.

MythRab의 이미지

socket을 통해서 하드웨어의 정보를 읽어 오는 함수가 있습니다.
이 함수를 여러 thread가 호출을 하고 있고요.
이 함수 안에서도 다른 함수(서브 함수라고 칭하겠습니다) 몇 개를 호출합니다.
여기서 자꾸 fault가 나서 thread들 끼리의 충돌이라고 생각했습니다.
그런데... 그게 아니었습니다.
몇 개의 thread가 사이 좋게 실행이 되다가 어느 순간 한 thread가 서브 함수를 두 번 호출하는 것이었습니다.
예를 들면 서브 함수 중에 socket을 통해 request하는 함수가 있고, 그 결과를 receive하는 함수가 있는데
request함수를 두 번 호출하고 receive함수는 한 번 호출하고... ㅡㅡ 반대로도 합니다.
이런 경우가 어떻게 생길 수 있는지... 난감합니다.
아시는분의 도움을 부탁드립니다.

참고로 전역변수나 static 변수는 사용하지 않고, OS는 Linux8.0 그리고pthread 입니다.

bugiii의 이미지

함수 재진입 문제 같습니다.

말씀하신 것을 가지고 추측해보면 그 함수를 호출하는 쓰레드가 그 함수를 실행하고 있는 동안에는 다른 스레드가 그 함수를 호출하지 못하도록 해야 하는 것 같습니다.

pthread 에는 그런 곳에 사용하는 mutex 가 있으니 한번 찾아보시고 적용해보세요. 재진입 문제를 여러가지로 해결할 수 있지만 mutex 를 사용하면 가장 쉽게 해결하실 수 있습니다.

다만, 전체 어플리케이션의 성능에 문제를 끼칠 수 있는 지 잘 파악하셔서 적용하시기 바랍니다.

그럼, 이만...

stoneshim의 이미지

Quote:
몇 개의 thread가 사이 좋게 실행이 되다가 어느 순간 한 thread가 서브 함수를 두 번 호출하는 것이었습니다.
예를 들면 서브 함수 중에 socket을 통해 request하는 함수가 있고, 그 결과를 receive하는 함수가 있는데
request함수를 두 번 호출하고 receive함수는 한 번 호출하고... ㅡㅡ 반대로도 합니다.

서브 함수를 특정 thread가 직접 호출하는것은 아니지요?

말씀하시는 것이... 예를들면 원래 노출된 함수의 flow가 서브1 함수를 실행한 후에 서브2 함수를 실행하고 리턴하게 되어 있는데, 어떤 상황이 되면 하나의 스레드가 노출된 함수를 호출하여 정상적인 flow대로 흘러가지 않고, 서브1 함수를 실행한 후 서브2 함수를 실행하지않고, 다시 서브1함수가 실행된다는 말씀인가요?

대체로 코드의 flow를 보았을때, 도저히 이렇게 실행될 수가 없어 보이는데 엉뚱한 flow로 진행이 되면서, 문제가 발생한다면, stack 이 깨지는 경우입니다.
단적인 예가 stack overflow죠.

stack에 선언된 변수에 할당되는 메모리 영역을 넘어가는 경우가 없는지 잘 살펴보시면 해결책이 있을듯 합니다.

우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자

댓글 달기

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