메세지 큐와 세마포어

하하의 이미지

"메인 스레드가 msgsnd를 합니다.

똑같은 일을 처리하는 자식 쓰레드들이

msgrcv를 합니다."

1. msgrcv를 하는 자식 쓰레드들은 message queue에

데이터가 있으면 가져가서 일을 처리합니다.

이럴때. 문제가 있나요?

왜 이런 질문을 하는지는

세마포어와 메세지 큐를 같이 쓰는 다음과 같은 사용에 대해

이해가 안되서 그럽니다.

다시 맨 처음 예를 변경해 보면

"메인 쓰레드는 msgsnd를 합니다.

msgsnd를 한후 sem_post 를 합니다.

같은 일을 하는 자식 쓰레드들은 sem_wait을 한후

즉 하나의 쓰레드만이 제어권을 획득한후 msgrcv를

합니다."

여기서 세마포어를 굳이 사용해야 할 필요성이 있는지

묻고 싶습니다. 왜냐하면 같은 일을 처리하는 자식 쓰레드

들은 세마포어를 하던 말던 msgrcv를 할때 어자피 하나의

자식 쓰레드만이 msgrcv를 할 수 있지 않나요?

lovemyin의 이미지

메인이 Write할 때와 자식이 Recv 할때 동기화에 대한 생각을 해보시는게 어떠실런지...

자식이 읽고 있는 중에 메인이 써버리면 어떻게 될까요???

/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/

hokim의 이미지

하하 wrote:

여기서 세마포어를 굳이 사용해야 할 필요성이 있는지

묻고 싶습니다. 왜냐하면 같은 일을 처리하는 자식 쓰레드

들은 세마포어를 하던 말던 msgrcv를 할때 어자피 하나의

자식 쓰레드만이 msgrcv를 할 수 있지 않나요?

예 맞습니다. 메세지 큐에서 메세지를 가져가는 과정에서 세마포어를
사용할 필요가 없습니다. 서로 경쟁하는 자식 프로세스들이 있다고 하더라도 메세지를 가져갈때는 오직 하나의 프로세스만이 접근가능합니다

bejoy4him의 이미지

lovemyin wrote:
메인이 Write할 때와 자식이 Recv 할때 동기화에 대한 생각을 해보시는게 어떠실런지...

자식이 읽고 있는 중에 메인이 써버리면 어떻게 될까요???

글쎄요.. 들어주신 예가 과연 적합한 예인지 의심이 드는군요
메인이 Write할때와 자식이 Recv할때 동기화가 필요한 경우는 공유 메모리와 같은 곳에서 특별한 경우(서로가 쓸수 있고 읽을수 있는 상황)에나 필요하지 처음 물어본 메시지 큐와는 전혀 관계가 없어 보이는데요.

메시지 큐에서 Write하고 있는 중간에 그 Write하고 있는것을 Recv를 할수는 없는것으로 알고 있습니다. Write와 Recv가 동시에 이뤄진다고 해도 현재 쓰고 있는 것을 Recv하는 것이 아닌 이전에 큐잉 시켜놓았던 것에 대해서 Recv하는거 아닌가요?

메시지 큐 사용하면서 세마포어를 사용하는것은 코딩 실수이거나 순수하게 메시지 동기화 부분이 아닌 다른 부분에서 필요했기 때문이 아닐까요?

그다지 있을것 같지는 않지만, 메시지 큐에 Write하고 있을때에는 어떤 특수한 이유로 이미 큐잉된 데이터라 할지라도 Read하지 못하게 해야할 경우같은...

lovemyin의 이미지

윗분 말씀대로 제가 뭔가 착각한것 같습니다.
이럴땐 정말 어디론가 숨고 싶다는 생각이 들지만... 이렇게 잘못을 인정하는것 또한 이곳에서 배울수 있는 하나라고 생각합니다.
충고 감사드립니다.

/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/

댓글 달기

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