pthread_create 질문입니다 급해요ㅠ

rhkdgus232의 이미지


void *Print(void *threadid)
{
long t;
t = (long)threadid;
printf("print %ld\n", t);
pthread_exit(NULL);
}

메인안에

for(t=0; t<10; t++)
{
printf("main %d\n", t);
rc = pthread_create(&thread[t], NULL, Print, (void*) t);

}
pthread_exit(NULL);

이런 식인경우
main 0
main 1
.
.
.
main 10
print 9 //여기는 뒤죽박죽 ..
print 10
.
.
.
print 0

이런식으로 출력이 됩니다. 여기서 궁금한건 main이 끝날때 까지 pthread 함수 하나도 작동을 안한건가요?

다른 분들 예제들을 보면 pthread_create 부른 순간 바로 다음 라인에 thread가 출력이 되던데 무엇이 다른건가요? 예를들면
main 0
print 0 이런식..
main 1
print 1
.
.
.

smallhuman의 이미지

1. 코드가 좀 이상해 보이네용...

void *Print(void *threadid)
{
long t;
t = (long)threadid;  ////// 이 라인.
/**********
첫째. void의 포인터로 받았는데 이걸 long으로 캐스팅하는 게 이상합니다.
그리고 넘겨주는 값은 int였네용.. t = * (int *) threadid; 이런 식으로 바꿔주는 게 적당해 보입니다.
**********/
printf("print %ld\n", t); 
pthread_exit(NULL);
}
 
for(t=0; t<10; t++)
{
printf("main %d\n", t);
rc = pthread_create(&thread[t], NULL, Print, (void*) t); //// 이 라인
/**********
t는 변수인데 변수를 void의 포인터로 캐스팅할 수 없을 듯하네요. 저는 dataarr를 만들고 여기에 값을 넣어서 넘겼습니다.
중요한 부분만 적으면
int dataarr[10];
dataarr[t] = t; => for문 안쪽
(void *) &dataarr[t] 이런 식으로요.
**********/
}

이렇게 고치고 실제로 돌려보니 결과가 그야말로 뒤죽박죽입니다 -_-;;; main 0 이 가장 먼저 출력되고 주로 main이 먼저 출력되긴 하지만 나머지는 느려요.

그리고 각 thread에서 출력이 끝나기 전에 main 스레드가 종료되어 추가적인 내용이 출력되지 않는 현상이 있더군요. main 함수의 마지막에 sleep(1)정도를 넣어주시면 해결됩니다.

kukyakya의 이미지

쓰레드를 생성한다고 해서 새로 생성된 쓰레드가 먼저 실행되지는 않습니다. 생성된 쓰레드가 스케쥴링 되어야 실행이 시작되는데, 그 전에 main 함수에서 loop을 다 도는 것 같네요.

원칙적으로는 '실행순서를 알 수 없다'라고만 알고 계시면 됩니다.

댓글 달기

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