2013-03-03 3 views
2

비 차단 방식으로 작동하는 스레드를 생성하려고하는데 호출자는 스레드를 기다릴 지 여부를 선택할 수 있습니다.다른 함수에서 스레드에 연결하기

class A { 
public: 
    void run(); 
    void wait(); 
    pthread_t worker; 
}; 

run() 함수는 스레드를 생성하고 즉시 반환합니다. 사용자가 대기해야하는 경우 wait()으로 전화 할 수 있습니다. 내가 WaitUntilDone()는, 그러나, 호출자가 전혀 차단되지 호출 할 때 정의는

void A::Run() { 
    //create worker thread 
    pthread_attr_t attr; 
    pthread_attr_init(&attr); 
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); 
    FATALIF(pthread_create(&worker, &attr, work, param), "Error creating worker thread."); 
    pthread_attr_destroy(&attr); 
} 

void A::WaitUntilDone() { 
    FATALIF(pthread_join (worker, NULL), "joining threads failed."); 
} 

처럼 보인다. 그럼 난 Run()WaitUntilDone()에서 join를 이동했는데, 그것은 작동 : 내가 찾을 cound pthread_join의 예에서

void A::Run() { 
    //create worker thread 
    pthread_attr_t attr; 
    pthread_attr_init(&attr); 
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); 
    FATALIF(pthread_create(&worker, &attr, work, param), "Error creating worker thread."); 
    FATALIF(pthread_join (worker, NULL), "joining threads failed."); 
    pthread_attr_destroy(&attr); 
} 

void A::WaitUntilDone() { 
    // do not wait here 
    // FATALIF(pthread_join (worker, NULL), "joining threads failed."); 
} 

을의 pthread_join 호출 pthread_create 직후 온다, 그래서 우리는 이러한 기능을 분리 할 수없는 날 것으로 보인다. 해결 방법이 있습니까?

+0

대기 여부를 나타내는 정적 변수를 사용할 수 있습니다. 어쨌든 run은 run을 실행하기 전에이 변수를 설정해야한다. 스레드가 실행되기 전에 사용자가이 변수를 설정했는지 확인하십시오. –

+0

이 api에서 사용자는'run' 다음에'wait'를 호출해야하지만 끝 부분에 설정할 변수를 정의 할 수 있습니다. 'wait'를 막기 위해'while' 루프를 사용하십시오 .. – Yang

+4

문제를 보여주는 작고 컴파일 가능한 코드 스 니펫을 만들 수 있습니까? 일반적으로'create'와'join' 호출을 분리하는 것은 문제가되어서는 안됩니다 - 적어도 그렇게하는 많은 코드를 작성했습니다. 또한,'pthread_join'의 리턴 값은 무엇입니까? 그리고'WaitUntilDone'을 호출 할 때 작업자 스레드가 여전히 실행 중입니까? – sonicwave

답변

2

pthread_join의 함수를 호출하기 전에 새로 생성 된 스레드가 아마도 반환 중일 수 있습니다. 따라서 전혀 차단되지 않지만 제대로 작동합니다.

관련 문제