thread내에서 부모스레드가 처리완료될때까지 기다리는 방법 문의드립니다.

siba555의 이미지

안녕하세요..
서버개발중인데요.. 접속이 되면 스레드가 1개 소켓을 처리하는 방식입니다.
그런데 이 소켓처리 스레드내에서 자식 스레드를 생성하고 이 자식스레드에서 다른곳으로 connection을 맺어 원격지 파일을 읽어오는 로직인데 read Ack가 올때까지 부모가 기다리는 방법이 있을까요?
쉬운방법으로 전역변수를 Ack가오면 값을 true로 만들고 무한루프돌면서 기다리는 방법이 있을건데 sleep를 걸지않으면 컨텍스트스위칭이 일어나지 않더군요.. sleep를 걸면 되지만 적은시간이지만 delay가 생기구요..
그래서 윈도우 이벤트처럼 자식스레드에서 작업이 완료될때까지 기다렸다가 자식이 이벤트를 보내면 깨어나서 부모스레드에서 일을 하는 방식이나 좋은 방법이 있는지 선배님들 조언을 구합니다.

즐거운 하루보내세요.

twinwings의 이미지

보통 세마포어가 공유자원 관리를 위해 쓰이기도 하지만

어떤 일의 순서가 주어졌을 때 제어하기 위해서도 쓰입니다.

(메모리 동기화 뿐만 아니라 시간적 동기화)

서로 다른 쓰레드에서 A->B 의 순서로 실행되게 하려면

A 코드에서는 마지막에 세마포어 하나 증가 하도록,

B 코드 처음에서는 세마포어 진입 조건을 걸어두면 운영체제가 알아서...

MyAbby의 이미지

프로그램 언어도 방언이 너무 많은 신기한 언어라 그냥 단서만 남겨드립니다:

condition variable, pthread join(), promise : future

조건 변수(cv), join()은 pthread 에 다 있습니다. promise, future는 c++11에 나온 개념이긴 하고 원래 스레드 동기화를 위해 쓰는게 아니긴 하지만 뭐, 동기화에도 활용할 수 있습니다.

cv는 윈도의 이벤트 핸들처럼 여러번 활용 가능하고, join(), promise:future는 일회용.

아주~ 간단하게 이렇게 하시면 됩니다. 자식 스레드가 반환될 때 까지 block:

std::thread th(threadRun); // 생성자 인수로 함수를 줌
th.join();

혹은 재사용:

std::condition_variable cv;
 
void threadRun() throw()
{
   while(true)
   {
      // TODO: Any task
      ...
      // TODO: Notify all waiting threads on cv
      cv.notify_all();
   }
}
 
int main()
{
    std::thread th(threadRun);
 
    cv.wait();
    // Case: The child thread has waken me up.
 
    ...
 
}
siba555의 이미지

c++11에서 새로 추가된 내용이 많네요..
감사합니다. ^^

댓글 달기

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