[질문] 스레드 하나더 T_T

bizzare의 이미지

모든 문제를 해결했다고 생각했으나 문제가 하나 더 남았네요. -_-;;

SUN에서
pthread_create(.., .., Func, ~~)를 호출해도

Func가 호출이 안되네요. -_-;

왠지 모르게 pthread_join()을 호출하면 Func이 호출되고요. -_-;

거참.. 정말 별게 다 고생하게 만드네요. T_T

왜 그럴까요?

bizzare의 이미지

pthread_create로 스레드를 생성한 후,

Quote:
sleep, usleep, pthread_join

과 같은 함수들을 이용하여
메인 스레드를 아주 잠깐이라도 멈춰주면 생성된 스레드가 실행되는 것 같습니다.

하지만 그다지 보기 좋은 방법은 아닌데,

좀 명쾌한 방법없을까요?

정말 깨끗하고 멋진 프로그램을 짜고 싶습니다.

pynoos의 이미지

확인을 어떻게 하셨죠?
pthread_create를 호출한쪽의 CPU시간이 다 차면 넘어가게 되어 있습니다.

또, 쉬게 하시려면 sleep(0)나 sched_yield를 사용하세요.

wariua의 이미지

사실 pthread_create() 직후에 호출한 스레드를 실행할 것인지 새로 생성된 스레드를 실행할 것인지는 스레드 라이브러리(혹은 운영체제)의 구현에 의존하는 문제입니다. (간단하게 샘플 코드를 짜서 테스트 해보면 제 리눅스 박스에서는 자식 스레드가 먼저 실행됩니다:)) 단, 이는 기본 스케줄링 정책을 사용한다는 가정 하에 그렇습니다.

자식 스레드가 먼저 실행되도록 하기 위한 가장 명쾌한 방법은 자식 스레드의 우선순위를 부모 스레드보다 높게 해주는 게 아닐까요?

$PWD `date`

kuaaan의 이미지

pthread_cond_어쩌구.. 하는 것들(일명 조건변수)를 써서 생성 즉시 포커스를 넘겨주고, 초기화가 끝난 다음 돌려받게 하는건 어떤가요?

----------------------------------------------
한번뿐인 인생....
미친듯이 살아보자!
----------------------------------------------

cronex의 이미지

bizzare wrote:
pthread_create로 스레드를 생성한 후,

Quote:
sleep, usleep, pthread_join

과 같은 함수들을 이용하여
메인 스레드를 아주 잠깐이라도 멈춰주면 생성된 스레드가 실행되는 것 같습니다.

하지만 그다지 보기 좋은 방법은 아닌데,

좀 명쾌한 방법없을까요?


sleep으로 쉬게 하는 것보다는
세마포어나 mutex등으로 동기화를 맞춰준다고 생각하면 더 깔끔하리라 생각합니다.
물론 코드는 좀 더 복잡해지죠. --;

------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!

spacelee의 이미지

음...thread 스케줄링에 대해서는 좀더 확실한 방법이 있습니다.

스케줄링을 임의로 조절하시는 것은,
보통 스케줄링이 fair하게 배분되지 못하다고 생각하셔서들 그러시는 것 같은데,
그건 thread가 process scope로 실행될때 그렇습니다

system scope로 실행되면 아주 fair하게
thread간에 cpu 가 분배가 됩니다.

man pthread_set_scope를 참조하셔서
create 하실때 attribute에 system scope로 지정해주세요.

* 간단한 설명

process scope는 process의 n개의 thread가
하나의 kernel thread(혹은 2-3개, OS에 따라서) 에
매핑이 되는 것이고,
system scope는 n개의 thread가 n개의 kernel thread에 매핑이 됩니다.

따라서,
process scope는
user level library 내에서 context switch가 되기 때문에
컴퓨터 기본의 context switch 방식을 따르지 못하고
프로그래밍 적으로 context switch를 해주게 됩니다.
따라서, IO나 sleep같은 system call 경우에 switch 되는 경우가 많습니다. (OS따라 다르긴 하지만)

system scope는 OS가 보통의 process나 thread에게 CPU를 배분해주는 메커니즘을
그대로 따라서 배분되기 때문에 매우 fair하게 배분됩니다.

권위를 의심할 것,어긋남을 존경할 것,자리잡기를 거부할 것,항상 자신을 재창조할 것 - MIT 미디어랩 -

spacelee의 이미지

bizzare 님이 오래 작업을 하신 것 같아,
쓰신 글을 쭉 봤더니
제가 해왔던 작업하고 비슷하네요.^^;;
(쓰레드를 사용한 멀티 OS 라이브러리,데먼)

머 작업이 거의 끝나셨다니
드릴 말씀은 없지만,
window쪽에 posix thread 라이브러리를 wrapping해놓은
라이브러리가 인터넷에 있더라구요.
(mutex, cond 포함)
저는 그거써서 posix thread쪽 포팅은 좀
쉽게 한 편이었습니다.

그냥 호기심에 무슨 작업하시는지
궁금하네요.^^

권위를 의심할 것,어긋남을 존경할 것,자리잡기를 거부할 것,항상 자신을 재창조할 것 - MIT 미디어랩 -

bizzare의 이미지

정말 많은 분들이 정성껏 올려주신 답변을 보면
힘이 납니다!

저도 이 곳에 빨리 답변을 올릴 수 있는 내공이 쌓이면 좋을텐데말입니다.. :-)

정말 깨끗하고 멋진 프로그램을 짜고 싶습니다.

댓글 달기

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