[질문] 쓰레드 생성하여 scanf실행시

stypr의 이미지

#include <pthread.h>
#include <stdio.h>

void serveIt1();
void serveIt2();

int main()
{
        pthread_t tid;

                if ( pthread_create(&tid, NULL, (void*) &serveIt2, NULL) ) {
                                printf("error creating thread.");
                }
                if ( pthread_create(&tid, NULL, (void*) &serveIt1, NULL) ) {
                                printf("error creating thread.");
                }
}
void serveIt1()
{
        printf("aaaa");
}

void serveIt2()
{
        char buf[100];
        scanf("%s", buf);

}

scanf 가 먹히질 않네요..

사실은 저 소스는 테스트 용이구요

void serveIt2() 이 함수 안에 소켓으로 Server를 만들어 기다리게 하는데
accept 함수에서 -_- 그냥 프로그램 끝나버리더라구요.
계속 대기 하고 있어야 하는데..

ㅇ ㅔㅎ ㅕ~! ...

좋은 답변 부탁 드립니다. 수고하세욥.

dudungsil의 이미지

쓰레드와는 관계없는 문제일수도 있습니다. 실제 코드도 아닌 상태에서 정확한 판단을 해낸다는건 불가능에 가깝구요.

아주 특별한 방법을 사용하지 않았다면 accept는 blocking 함수입니다. 쓰레드가 멈춰야되는데 바로 끝난다는건 accept가 error를 리턴했다는 겁니다. 리턴값과 errno를 먼저 확인해보세요.

산넘어 산

stypr의 이미지

에러값은 다 체크 해봤습니다.

그리고 저 소스 또한 똑같은 현상을 나타냅니다.

실행 해보면 똑같은 현상을 ..... -_-

어디서 문제가 ㅠ.ㅠ.ㅠ.ㅠ.ㅠ.

dudungsil의 이미지

메인 쓰레드가 쓰레드 두개 만들고 그냥 종료되버리니 당연히 자식 쓰레드도 정리되고 끝나죠.

if () 두개 실행하고 그냥 끝나자나요. scanf로 대기를 하더라도 메인 쓰레드가 종료되면 끝입니다. 저위 코드대로라면 그렇네요.

산넘어 산

stypr의 이미지

아그렇네요 -_-; 왜 그걸 못봤을까요.. 감사합니다... ㅠ.ㅠ 감격..

그럼 쓰레드들이 다 끝난다음에 끝나게 할려면 어케 해야 할지..

끝내는 처리는 main에서 해야 하거든요..

어떻게 생성된 쓰레드들이 죽었는지 체크를 할지...

darkblue99의 이미지

pthread_join ( tid, NULL );

라고 thread 생성시킨후 main()에 넣어두시죠.

그리고 thead id는 각각 만드는게 좋지 않을까요?

handle인데요..

---------------------------------------------------------------
pthread_t tid1;
pthread_t tid2;

if ( pthread_create(&tid1, NULL, (void*) &serveIt2, NULL) ) {
printf("error creating thread.");
}
if ( pthread_create(&tid2, NULL, (void*) &serveIt1, NULL) ) {
printf("error creating thread.");
}
}
pthread_join ( tid1, NULL );
pthread_join ( tid2, NULL );

Be Postive!

FruitsCandy의 이미지

아래는 joinc.co.kr에서 퍼온내용입니다.

pthread_join 을 이용하시면 정상종료처리가 가능합니다.

#include <pthread.h>
int pthread_join(pthread_t th, void **thread_return);

첫번째 아규먼트 th는 기다릴(join)할 쓰레드 식별자이며, 두번째 아규먼트 thread_return은 쓰레드의 리턴(return) 값이다. thread_return 이 NULL 이 아닐경우 해다 포인터로 쓰레드 리턴 값을 받아올수 있다.

pthread_joinc.c

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

// 쓰레드 함수
// 1초를 기다린후 아규먼트^2 을 리턴한다.
void *t_function(void *data)
{
int num = *((int *)data);
printf("num %d\n", num);
sleep(1);
return (void *)(num*num);
}

int main()
{
pthread_t p_thread;
int thr_id;
int status;
int a = 100;

thr_id = pthread_create(&p_thread, NULL, t_function, (void *)&a);
if (thr_id < 0)
{
perror("thread create error : ");
exit(0);
}
// 쓰레드 식별자 p_thread 가 종료되길 기다렸다가
// 종료리턴값을 가져온다.
pthread_join(p_thread, (void *)&status);
printf("thread join : %d\n", status);

return 0;
}

아지랑이류 초환상 공콤 화랑... 포기하다.. T.T

댓글 달기

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