2009-11-18 4 views
1

스레드가 종료되었는지 어떻게 확인합니까? 내 경우에는 my_pthread [5]가 있고 5 개의 스레드 중 하나가 작업을 마쳤 으면 확인하고 싶습니다. (잘 모르겠습니다) 그러면 더 많은 작업을 수행 할 수 있습니다. I는 pthread_join을()를 사용하면pthread를 사용할 때 스레드가 종료되었는지 어떻게 확인합니까?

후는되어야한다 :

pthread_join(my_pthread[0]); 
... 
pthread_join(my_pthread[4]); 

스레드 [3] 스레드 전에 완료 될 경우 [0] 다음 I 가지고 기다리는 어떤 마무리 thread0, 1,2 ? 그건 내가 원하는 것이 아니야. 스레드가 끝날 때까지이 방법을 "대기를"그들이가 분리되지 않은 경우

답변

1
  1. , 당신은 그들이 pthread_join를 사용하여 기다릴 수 있습니다. 나는 그것이 당신이 원하는 것이라고 확신하지 못합니다.

  2. 다른 작업 (예 : 계속 실행)을 할당하려는 경우 일종의 통신 채널을 사용하십시오. 예 : 스레드 안전 큐 즉, 대기열을 사용하여 작업이 완료되면 신호를 보내고 새 작업을 별도의 대기열을 통해 밀어 넣습니다.

또한 thread도 분리 된 스레드와 관련하여 살펴보십시오.

0

부모 함수에 wait() 함수를 사용하면 자식 스레드에 설정된 신호가 있다는 것을 알고 있습니다. 그런 다음 wait.h에 정의 된 일부 매크로를 사용하면 완료된 스레드의 상태를 알 수 있습니다. 또한 스레드가 완료되고 exit() 명령을 사용하면 거기에 설정 한 매개 변수가 부모 스레드로 다시 전송됩니다. 이것이 C 세상에 있음을 여러분 모두 생각해보십시오. 다른 언어의 마일리지는 다를 수 있습니다.

+0

'대기'는 스레드가 아닌 프로세스입니다. –

0

pthread와 함께 작업 한 이후 오랜 시간이 걸렸지 만 일반적으로 스레드 프로그래밍에서는 스레드가 join() 호출을 완료 할 때까지 기다립니다. 조인에 대한 호출이 완료되면 스레드가 작업을 완료했음을 알게됩니다.

2

스레드가 완료/종료 될 때까지 기다리지 말고, 스레드가 신호로 끝난다는 신호가 나오므로 더 많은 작업을 처리 할 수 ​​있습니다.

내가 뭘 할 것은

  • 5 일 큐를 작성하고, 1 일 결과 큐

  • 5 개 스레드는 같은 결과에 다시 작업 큐 및 게시물 결과에서 작업을 가져 오는에 의해 루프 열. 메인 스레드에 결과를 다시 게시,

    for(;;) { 
        struct threadmessage msg; 
        struct *work_result; 
        struct *work; 
        thread_queue_get(&result_queue,NULL,&msg); 
        work_result = msg->data; 
        handle_result(work_result); 
        work = get_more_work(); 
        thread_queue_add(worK_result->queue,work,0); 
        free_work_result(work_result); 
    } 
    

    5 개 작업자 스레드의 각

    는 (몇 가지 작업을 처리 :

메인 스레드가 같은 것을 할 것 (5 개 스레드로 작업을 보내는)) 할 것 :

for(;;) { 
    struct threadmessage msg; 
    struct *work_result; 
    struct *work; 
    thread_queue_get(my_queue,NULL,&msg); 
    work = msg->data; 
    process(work_result); 
    work_result->queue = my_queue; 
    thread_queue_add(&result_queue,work_result,0); 
    free_work(work); 
} 

코드를 같은 큐를 구현하기 위해 현재 위치 : http://asgaard.homelinux.org/svn/threadqueue/

0

만약 내가 옳다면 5 개의 실 중 어느 것이 자신의 직업을 먼저 끝내는 지 알고 싶을 것입니다.주 스레드에 신호를 보내기 위해 각각의 세마포어를 사용하는 것이 좋습니다. 이렇게 :

sem_t signal; 

void *working_thread(void *p) 
{ 
    // do somthing useful 
    sem_post(&signal); 

} 

int main() 
{ 
    // create 5 threads and semaphore 
    sem_wait(&signal); 
    return 0; 
}