동시에 여러 thread를 만들고 각각의 채널로 그 thread들과 통신

indizarm의 이미지

동시에 여러 thread를 만들고, 만들어진 thread들과 각각
독립적인 채널로 main process가 대화합니다.

1. 언제 thread가 생성/ 소멸될지 모르며
2. main process는 각 thread에게/ 로부터 다른 데이터를
주거나 받습니다.
3. 동시에 여러 thread가 떠있는 경우, 그 thread들을
감시해서 적절하게 데이터를 보내거나 받는 처리를 해야
합니다.

어떻게 구성해야 할까요?

지금 생각한 것은

1. thread와 메세지큐
2. 메세지큐는 키값을 달리하는 방법으로 구분

이정도인데, 어떻게 각 thread를 감시해야 할지 잘 안떠
오르는군요.

또 다른 thread로 thread에 관한 링크드 리스트를 전달
하거나 전역변수로 선언해서 처리를 해야할지... (그러나
이때 thread에 관한 링크드 리스트가 변하는 경우 혼란이
예상됨...)

어떤 식으로 해야 할까요?

jemiro의 이미지

pthread_mutex와 pthread_cond를 사용하면 되지 않나요?
프로세스간 통신도 아니고, 쓰레드 끼리 라면(메인쓰레드포함)
메모리를 공요하는 쓰레드에서 굳이 메세지큐를 사용하시려는 이유가 있으신지.
좀더 자세한 설명을 해주시는것이 좋을것 같습니다.

indizarm의 이미지

1. main process는 강제로 종료시키기 전까지 돌아갑니다.
2. 외부의 호출이 있을 경우 별도의 thread/ process를 만
들어서 처리를 해야 합니다.
3. 이 처리 과정에서 생성된 thread/ process는 main process
와 데이터를 주고 받아야 합니다.
4. 외부의 호출, 즉 thread/ process의 생성은 예측할 수
없으며, 동시에 여러 번 발생할 수 있습니다.
5. thread/ process의 종료 시점도 알 수 없습니다.

이런 조건인데요, fork와 thread 두 가지 방법을 모두 시도
해볼 생각이고요. 우선은 thread로 하기로 한겁니다.

그런데 main process와 각 thread와의 데이터 교환은
독립된 채널로 해야하는데요, 각 thread는 공유하는 데
이터가 없습니다.

IPC에 관해서 살펴보니까 양쪽의 process/ thread들이
데이터를 주고 받을 때, OS에서 알려주는 것이 아니라
각각이 능동적으로 쓰고 읽어야 하는듯 하더군요.

pthread_mutex와 pthread_cond는 man 해도 나오지
않던데, 어떤 것인지 간략하게 설명 좀 해주시면 감사하겠
습니다.

What a Cool Days!!!

sunyzero의 이미지

메인 프로세스와 쓰레드의 통신이라는게 무슨말인지 잘 모르겠군요.

쓰레드는 메인프로세스와 데이터영역을 공유합니다. 따라서 메인프로세스에서 받은 데이터는 그냥 변수참조가 가능합니다. 물론 적절하게 synchronization이나 mutex를 사용하지 않으면 여러개의 쓰레드에 대해서 얽혀버릴 수가 있겠죠.

보통 main의 service function쪽에서는 poller 같은 것으로 데이터를 쓰레드에게 넘겨주는게 일반적입니다.

========================================
* The truth will set you free.

indizarm의 이미지

그냥 변수 참조가 가능하다면, thread에 변수를
구조체 형태로 전달해준다거나, IPC로 데이터를
주고 받을 필요없이, 각 thread가 참고해야 하는
main()의 변수에 값을 쓰고 읽는 것 만으로도
처리가 가능하다는 말씀입니까?

What a Cool Days!!!

sunyzero의 이미지

indizarm wrote:
그냥 변수 참조가 가능하다면, thread에 변수를
구조체 형태로 전달해준다거나, IPC로 데이터를
주고 받을 필요없이, 각 thread가 참고해야 하는
main()의 변수에 값을 쓰고 읽는 것 만으로도
처리가 가능하다는 말씀입니까?

네~ 맞습니다. :lol: main()에서 선언한 변수는 쓰레드에서 그냥 사용할 수 있습니다. 그냥 불러다 써보세요. 잘 될겁니다. IPC는 말그대로 프로세스간의 통신입니다. 쓰레드처럼 데이터영역을 공유하는 경우엔 필요가 없죠.

========================================
* The truth will set you free.

mastercho의 이미지

쓰레드를 사용하는 중요한 이유중 하나가 쓰레드끼리 자료를 교환할때

커널을 통하지 않고 자료를 교환하는데 있습니다
[IPC 메커니즘은 자료를 커널에서 중계를 해주느것입니다(오버헤드가 큼)]

따라서 pthread에서 제공하는 메커니즘을 이용해야지

그렇지 않은 경우 OS 아키텍쳐에 따라 문제가 발생할수 있습니다

큐 구조를 굳이 이용하고 싶다면

전역공간이나 클래스 내부변수[클래스중심의 객체지향 방법으로 만들경우] 에

쓰레드간에 공유하는 큐를 직접 만드시면 됩니다

어렵지 않고요

개인적으로는
pthread_mutex_t pthread_cond_t 를 이용해서 class로 큐를 만들어 사용합니다

승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스

indizarm의 이미지

답변 감사드립니다. 계속 해봐야겠군요.

What a Cool Days!!!

댓글 달기

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