스레드 질문입니다. pthread , condtion 과 broadcast signal

익명 사용자의 이미지

스레드에서 브로드캐스트로 시그널을 보내면
conditin variable에 의해 시그널을 wait하던 스레드들이 모두 시그널을
받는다고
하는데 그렇다면 , 그중에서 cpu에 의해 임의로 선택된 하나의 쓰레드만이
블록상태에서 깨어나 수행하게 되나요?

익명 사용자의 이미지

CPU에 의해서 한개의 스레드만 활성화 되는것이 아니라, 전체다 수행하게
됩니다. 스레드 mutex를 이용해서 스레드를 처리 하세요.
스레드를 어느 부분에서 wait시키시려고 하는지는 모르겠지만
만약, 순차적인 스레드의 활성화가 필요하다면 다른 로직이 필요할것
입니다.

스레드에 signal를 활용하는 방법은 적절치 않다고 봅니다.

초보 wrote..
스레드에서 브로드캐스트로 시그널을 보내면
conditin variable에 의해 시그널을 wait하던 스레드들이 모두 시그널 을
받는다고
하는데 그렇다면 , 그중에서 cpu에 의해 임의로 선택된 하나의 쓰레드만 이
블록상태에서 깨어나 수행하게 되나요?

익명 사용자의 이미지

mutex와 condition variable을 사용중에
condition variable조건때문에 block되어 cond-signal을 기다리고 있을때
어떤 다른 스레드가 브로드캐스트 시그널을 날리면 cond-signal을 기다리
면서 블록되어있던 다수의 스레드중 하나만이 깨어나서 실행되는가?

아니면 모두 동시에 깨어나서 실행된다면 mutex lock을 동시에 얻는경우는
있을수 없는경우자나요..

다시정리할께요.
mutex를 얻은후 컨디션 시그널을 기다리면서 블록되어있는 복수개의 스레
드가 존재할때 제 3의 스레드에서 컨디션 브로드캐스트 시그널을 날리면
기다리고 있는 복수개의 스레드가 어떻게 반응하냐는것이죠.

익명 사용자의 이미지

익명 사용자의 이미지


그렇지 않습니다. 모든 thread가 깨어납니다.
모든 thread가 깨어나긴 하는데 pthread_cond_wait() 함수 호출을
끝내고 리턴할 때에는 함수 호출시 unlock시켰던 mutex를 다시 lock하게
되어 있습니다. 그래서 맨 처음 깨어난 녀석만 성공적으로 해당 mutex를
lock시키고 다음 문장을 수행할 수 있는 것이고, 다른 모든 녀석들은
mutex의 lock에 대기하고 있는 상태가 됩니다.
(이걸 깨어난 상태가 아니라고 말씀하시면 그럴수도 있겠지만,
이번에는 cond가 아니라 mutex에서 block되어 있는 것입니다.)

pthread_mutex_lock(&mutex);
while (count <= 0) {
pthread_mutex_cond(&cond, &mutex);
printf("%d 짹!\n", (int)pthread_self());
}
pthread_mutex_unlock(&mutex);

위와 같은 코드에 10개의 thread가 걸려있다고 하면 10개 모두
"짹!" 소리를 낼겁니다. thread가 cond에서 깨어났다는 것을뜻하죠.
printf("짹!\n") 앞에 sleep(5); 정도 주면
5초마다 한번씩 '짹!' 하는 소리를 들을 수 있을 것입니다.
이건 cond에서 깨어났지만 mutex에서 block되어 있고,
맨처음 mutex를 잡은 녀석이 5초간 sleep하고 있기 때문에
다른 녀석들이 block되어있는 것입니다.

댓글 달기

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