가끔 msgrcv가 메시지큐에 데이타를 못가져가는 문제.... ㅡ..ㅡ+

xian의 이미지

한 프로세스에게 스레드를 두 개를 띄웁니다.
한 스레드는 메시지큐에 데이타를 input하는 "thread_msgsnd"이고
다른 하는 아래 제가 코드를 복사해 놓은 메시지큐에서 데이타를 가져가는
"thread_msgrcv"스레드입니다.
그런데 자주 발생하는 것은 아닌데 아주 간혹 thread_msgsnd스레드에서는 데이타를 잘 넣고 있는데
thread_msgrcv에서는 데이타를 안가져가고 멍청하게 있는 경우가 있습니다. 결국 큐풀이 나버립니다.
제 부족한 실력으로는 아무리 봐도 왜 그런지 모르겠습니다. 코딩은 맞게 한거 같은데..
데이타량이 많아져서 그런거 같기도 하고..

고수님들의 귀한 조언 부탁드립니다.

/* 메시지큐에서 데이타를 가져가는 스레드 */
void* thread_msgrcv(void *arg)
{
............<생략>......................
while (!g_exitflg)
{
memset(&quedata, 0x00, sizeof(QUE_DATA));

/*message queue 대기*/
if((nPacketSize = msgrcv(writequeue, &data, sizeof(DATA),
0, IPC_NOWAIT|MSG_NOERROR)) <= 0)
{
if (nPacketSize < -1)
{
printf("faile to msgrcv!!!\n");
}
}
............<생략>......................

return NULL;
}

mach의 이미지

쓰레드의 스케쥴링문제가 아닌가 예측됩니다.
개발자 의도는 골고루 잘~ 돌아라.인데,...
쓰레드 스케쥴링이 묘?하게 생산자쪽으로 몰리는 경우가 아닐까? 예측해봅니다.
적어도 생산자가 받은 스케쥴링 시간 동안에는 아무리 열심히 넣어도, 큐사이즈가 넘치지 않을 정도로 충분한가 검토하시고, 큐를 보다 일반화시켜서 만드는 것도 방법이겠구요, 다른 한편, 인위적으로 스케쥴링에 개입하시는 것도 방법이 아닌가합니다.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

xian의 이미지

mach님 글 보고 그럴 수도 있겠다 싶어서 큐에 데이타를 밀어 넣는 스레드 데이타를 더 이상 못밀어 넣도록
끊었는데요 데이타를 빼가는 스레드 녀석은 여전히 멈춰 있습니다.
ㅡ,.ㅡ; 큭.... 아~~ 뭐가 잘못인지...

xian의 이미지

두 스레드간 락을 걸고 그런 것은 없고요...
그래서 여하튼 thread_msgrcv에서는 데이타를 안가져가길래 다른 메시큐를 받아가록 프로세스를 만들어서 임시로 빼가도록 했더니 데이타를 빼오더군요.. ㅡ,.ㅡ;
그럼 이게 메시큐 문제는 아닌거 같은데 뭐가 문제일까요 ㅡ,.ㅡ;; 답답...

mach의 이미지

메시지큐에 데이터를 넣는 쓰레드의 코드중 데이터를 넣은 다음 줄에서
sched_yield();를 넣어 테스트를 해보세요.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

xian의 이미지

sched_yield(); 이 함수가 뭔지 몰라서 여기에서 검색해 보니 sleep(0);이랑 비슷하게 스레드 점유를 빼앗더군요..
mach님이 알려주신 sched_yield함수는 라이브러리 링크 때문에 컴파일 안되길래 sleep()으로 수정하고 돌려 봤는데 처음에는 괜찮은거 같았는데 증상이 다시 나타나는군요..
리눅스에서 잘되던건데 솔라리스로 옮기니깐 이렇네요 ^^;;
여하튼 mach님 조언 정말 감사합니다. ㅎㅎ

xian의 이미지

리눅스에서는 usleep이 별 문제가 없었는데
솔라리스에서는 usleep을 사용하면 간혹 알람시그널이 생기면서 스레드를 죽여서 그런거였습니다.

댓글 달기

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