[질문] 쓰레드 동기를 어떻게 해야 하는지요?

zaru의 이미지

// 전역변수
var1;
var2;
 
main ()
{
  create_thread1();
  create_thread2();
 
  while (1) {
    // 기다리고 있다가.. thread1()과 thread2()에서 var1과 var2에 값이 들어오면
    // 두 변수의 값을 읽어 display
  }
}
 
thread1()
{
  while (1) {
    var1 = 11; // 1초마다 들어가는 값이 다름.
    sleep(1);
  }
}
 
thread2()
{
  while (1) {
    var2 = 22; // 1초마다 들어가는 값이 다름.
    sleep(1);
  }
}

위와 같이 구현 할려면 쓰레드 동기를 뭘로 어떻게 해야 하는지요? 조언 부탁드립니다.
감사합니다.

익명사용자의 이미지

조건변수를 쓰시면 됩니다.

zaru의 이미지

다음의 쓰레드 동기화 관련 함수들을 말씀하시는 것인지요?
pthread_mutex_init
pthread_mutex_destory
pthread_mutex_lock
pthread_mutex_unlock
pthread_cond_init
pthread_cond_signal
pthread_cond_boradcast
pthread_cond_wait
pthread_cond_timewait
pthread_cond_destroy

감사합니다.

===============================
힘써 면학하되 스스로 흥미를 느끼도록 하여야 하며 늘 익혀야 할 것이다

익명사용자의 이미지

조건변수로는 안되용.

zaru의 이미지

어떤걸 어떤식으로 써야 하는지 코멘트 좀 부탁 드립니다.

===============================
힘써 면학하되 스스로 흥미를 느끼도록 하여야 하며 늘 익혀야 할 것이다

익명사용자의 이미지

mutex 와 cond 을 만듭니다.

쓰레드 내에서 cond 이 바뀌면 signal 을 줍니다.
값 변동을 보는 쪽 쓰레드(main)은 mutex+cond 을 lock 하고 signal 되길 기다립니다.

그럼 값이 바뀔때 마다 출력을 하게 됩니다.

단, cond 을 하나만 주면 두개 쓰레드 중 특정 값만 바뀌면 출력을 합니다. cond을 두개를 만들어 두개값이 모두 바뀌는 경우를 검사할 수 있습니다. 그럼 두개 값이 모두 바뀌는걸 기다리겠지요.

mutex를 lock해서 기다리고, mutex를 cond과 연결시켜 cond 시그날에 mutex의 lock이 해제되는 시점을 얻어 내는 겁니다.

위에 적으신 모든 함수를 다 보십시오. 다 조금씩 관련이 있고 취사 선택혹은 모두 사용해야 할 수 있습니다.
상태에 따른 쓰레드 동기화는 어떻게 활용하냐에 따라 조금씩 사용이 다르고 스펙과 설명을 보고 스스로 익히세요.

그리고, 자식 쓰레드가 1초마다 바뀐다면 제가 질문 드리고 싶은데 굳이 동기화를 왜 하십니까? 그냥 1초마다 갱신하면 되지 않나요? 일정 주기를 선택해서 상태동기화 필요없이 주기적으로 출력하면 복잡하지도 않고 그렇다고 효율성에 문제도 없이 해결될 거 같습니다. (물론, 추가적인 문제가 없다면요..)

익명사용자의 이미지

조건변수로는 안된다니? 조건변수가 뭔지 모르시는것 아니신아ㅛ?
조건변수란 뮤텍스와 조건변수가 포함된 동기화 매커니즘을 의미하는 것입니다.
맨 아랫 분이 뮤텍스와 조건 변수에 대한 설명을 잘 해주셨네요.

zaru의 이미지

gdb로 쓰레드 디버깅 할려면 어떻게 하는지요?

감사합니다.

===============================
힘써 면학하되 스스로 흥미를 느끼도록 하여야 하며 늘 익혀야 할 것이다

댓글 달기

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