thread질문

ddoman의 이미지

class A
{
a( 패킷 ); //패킷을 넘겨받아 처리하는 함수
B socket_thread;
}

class B : public thread
{
어쩌구저쩌구 // 소켓용 thread class
}

위의 경우에 class A가 소켓용 쓰레드 B를 생성한 경우이고.
class B가 패킷을 받아서 class A의 a()함수에
넘겨주는 상황인데요.
물론 B의 객체는 루프를 돌고 있고, 리드할때마다 A의 a()에 넘겨주고..

while(1)
{
read( buffer, size );
parent->a( buffer, size );
}

암튼 class B의 루프안에서 A의 a()를 호출할때
a()가 리턴될때까지 B의 thread는 블럭이 되나요?
그렇다면 a()가 패킷을 처리하가 전까진 그동안은 리드하지 못한다는
것이겠네요?

블럭되지않게 할려면 어떤 방법을 써야할까요?

nangchang의 이미지

물론 blocking이 됩니다.

언뜻 생각하기에는 데이터를 처리 하는 쓰레드를 따로 생성하고

데이터를 거기로 던져서 데이터는 그넘이 처리하게 하고

소켓 읽는 넘은 제 갈길을 가도록 하는 방법이 있을꺼 같네요...

머.. 어떤 방식이든.. 소켓에서 읽는 쓰레드와 읽은 데이터를 처리하는 쓰레드로

분리하는 방법을 써야 할 것 같습니다.

고도리의 이미지

:(

보통 open source중에 쓰레드를
이용한 프로그램들은 대부분 쓰레드 생성과 데이터 받는 부분,
데이터 처리부분은 분리를 해 줍니다.

주로 main()에서는 모든 쓰레드와 쓰레드간의 동기화 메카니즘을
enable시키고, 이 때 생성된 쓰레드끼리 서로 주고받고 알아서
할 수 있도록 작성해 줍니다.

간단하게 설명하면

Q data_send_q;

main()
{
q_init(data_send_q);

semaphore_init();

create_receive_thread();

create_received_data_process_thread();
}

create_receive_thread()
{
read_received_data();

write_q(data_send_q);

semaphore_give();
}

create_received_data_process_thread()
{
semaphore_take();

read_q(data_send_q);

process_received_data();

}

이런식으로 많이 작성합니다. 코드 스타일을 보면 주로
커널의 device driver나 RTOS 상에서 프로그밍하는 스타일입니다.

여기서 semaphore는 일반적은 유닉스의 IPC의 세마포어가 아니고
thread 고유의 동기화 메카니즘입니다.

왜냐하면, 그냥 유닉스나 리눅스의 IPC중의 세마포어를 쓰면
예상외의 결과가 나오는 경우가 생깁니다.

물론, 여기 스타일로는 그런일이 발생안할지도 모르지만,
일반적으로는 동기화에 문제가 생기기 때문에 쓰레도 고유의
동기화 메카니즘을 사용해야 합니다.

그럼, 조금이라도 도움이 되었길....

서명.....음, 서명이라...

아싸!!! Three Go!

june8th의 이미지

비단 socket i/o 뿐 아니라 다른 i/o인 경우도 마찬가지입니다.

thread를 써서 여러 i/o을 처리하는 경우, i/o 개당 하나의 thread를 할당하여야 non-block i/o처리가 됩니다.
그렇게 하지 않으려면, non-block i/o를 쓰고, polling이나 select를 하는 것이죠.
물론, 현실적인 문제를 해결하기 위해서는 이 두가지를 섞어서 쓸 수 있지만, 기본적으로 multi i/o 동시 처리를 위해서는
1. block-i/o 사용시 ( [n]i/o : [n]thread )
2. non-block-i/o 사용시 ( [n]i/o : [1]thread )

이 두가지 방법이 있다고 생각하면 됩니다.

댓글 달기

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