2012-05-19 5 views
2

지금 스레드에 대해 배우고 있습니다. 내 스레드 변수를 전달할 수 있는지 궁금하네요. 제 할당은 스레드를 만들고 각 스레드에 번호 (원하는 경우 이름)를 지정하고 100ms마다 번호를 인쇄하는 것입니다. 현재 프로그램은 다음과 같습니다 :새로 생성 된 스레드에 하나 이상의 변수를 전달하는 방법은 무엇입니까?

#define PCHECK(sts,msg) if((sts)!=0){printf("error : %s\n",msg); exit(EXIT_FAILURE)} 
#define NB_THREAD 5 

void* do_nothing(void* data) 
{ 
    int i; 

    //printf("creation thread %d",(int)data); 
    while(1) 
    { 
     usleep(100000); 
    printf("thread number : %d \n",data); 
    } 
    i = 0; 
    pthread_exit(NULL); 
    //exit(EXIT_SUCCESS); 
} 

int main(int argc, char *argv[]) 
{ 
    int pid, j, status; 
    pthread_t thread; 
    int * res; 
    int stat; 

    for (j = 0; j < NB_THREAD; j++) 
    { 
     stat = pthread_create(&thread, NULL, do_nothing, (void *) j); 
     if (stat !=0) 
     { 
      perror ("pthread_create()"); 
     } 
    } 
    for (j = 0; j < NB_THREAD; j++) 
    { 
     pthread_join(thread, (void **) &res); 
    } 



    return EXIT_SUCCESS; 
} 

순간적으로 인쇄되는 숫자는 0 (데이터 값)입니다. 내가 잘못 감사합니다 :)

답변

2
다음

의 pthreads

에 인수를 전달하는 방법의 좋은 예는 갔다 않은 곳에 누군가가 지적 할 수

[1] https://computing.llnl.gov/tutorials/pthreads/#PassingArguments

+1

감사합니다.이 링크는 매우 유용합니다. 스레드에 관한 모든 것을 다룹니다. 이제 내 수업을 더 쉽게 할 수있을거야 :) – kaninabu

+0

물론입니다. 당신은 또한 스레드 스택, 스레드 개인 데이터를 탐색 할 수 있습니다 .. –

1

내가 당신의 문제가있을 수 있다는 의심이 실행중인 이것은 32 비트 int 유형을 사용하는 64 비트 시스템에서입니다. 그래서 data 64 비트 void* 유형입니다하지만 스레드 함수에서 당신은 32 비트 int로를 인쇄하고 있습니다 :

// example assumes that this thread instance was started by 
// pthread_create(&thread, NULL, do_nothing, (void *) j) when 
// j == 1 

printf("thread number : %d \n",data); 
         ^ ^
         |  +-------- passing a 64-bit pointer 0x00000000.00000001 
         | 
         +---------------- treats the pointer argument as a 32-bit int and 
              happens to only see the all-zero 32-bits 

난 당신이 printf()을 변경하는 경우 당신은 당신이 기대하는 출력을 얻을 수 있습니다 의심 로 : 일반적, 스레드 기능을 쓸 때 나는 그것이 스레드 함수의 첫 번째 행동이 실제로 있었다 유형에 스레드 함수에 전달 된 데이터 항목을 변환 할 수있는 좋은 아이디어라고 생각으로

printf("thread number : %d \n", (int) data); 

pthread_create() :

에게 전달됨
void* do_nothing(void* data) 
{ 
    int id = (int) data; // `pthread_create()` was passed an `int` 
         // `data` is not used again after this point 

    // ... 
} 

몇 가지 다른 점

  • 당신이 스레드 함수에 데이터에 대한 실제 포인터를 전달하면, 데이터가 동일하게 생각하지 않으면 각 스레드가 (자신의 별도의 사본을 얻을 수 있는지 확인 가능하지만 드문 일이지만 각 스레드에 대한 인스턴스). 여러 스레드를 회전하는 경우

  • 당신은 (아마도, 배열) pthread_create()에 의해 반환 된 각 pthread_t 객체를 계속해야 하나 그래서 당신은 나중에에 가입 할 수 있습니다, 또는 당신은 재사용 전에 pthread_join()/pthread_detach()를 호출해야 pthread_t 개체를 사용하여 스레드가 실행을 마쳤을 때 해당 스레드에 할당 된 모든 리소스를 정리할 수 있습니다. 스레드가 영원히 (또는 무언가가 프로세스를 죽일 때까지) 실행되기 때문에 별 문제가되지 않을 수도 있습니다. pthread_join() 전화는 성공적으로 완료되지 않습니다.

    그러나 다음 코드는 스레드 함수는 일정 시간 이후에 중지 있도록 상황을 타개 할 때 휴식 운명 : 만 성공적으로 조인 후 마지막 스레드에 대한 pthread_t이 만든

    for (j = 0; j < NB_THREAD; j++) 
    { 
        pthread_join(thread, (void **) &res); 
    } 
    

    thread 때문에 더 이상 사용할 수 없습니다. 다음 루프 반복은 이미 조인 된 스레드에 참여하려고 시도하며 더 이상 유효하지 않습니다.

관련 문제