2011-05-04 4 views
0


이전의 문제를 해결하기 위해, 나는 친절하게도 pthreads를 통해 멀티 스레딩을 지적했다.C++ pthreads 멀티 태스킹 [windows]

원래 문제는 다음과 같습니다.
두 가지 기능이 있습니다. 그 중 하나는 실시간으로 본체입니다. 다른 하나는 지속적으로 실행되는 기능으로 차단됩니다. 블로킹 기능을 실행하려고 시도 할 때 실시간으로 명백한 블록이 생기므로 실시간 프로세스로 받아 들일 수없는 사용자에게는 반응이 없습니다.

원래의 목표는 차단 기능을 실시간 솔루션 (또는 적어도 의사 (pseudo-independent))과 독립적으로 만드는 것이 었습니다. 이는 pthread로 시도했습니다. 여기

코드의 단순화 된 버전입니다 :

void * RenderImages(void * Data) 
{ 
    while(1); //Simulating a permanently blocking process 
    return NULL; 
} 

int main(int ArgC, char *ArgVar[]) 
{ 
    pthread_t threads[PTHREAD_NUMBER]; 


    void *Ptr = NULL; 

    int I = 0; 
    I = pthread_create(&threads[0], NULL, RenderImages, Ptr); 
    if(I != 0) 
    { 
     printf("pthread_create Error!\n"); 
     return -1; 
    } 

    I = pthread_join(threads[0],NULL); 

    //Doesn't reach here as pthread_join is blocking 

    printf("Testing!\n"); 
    return 0; 
} 

위의 코드 그러나 함수를 직접 호출 불필요하게 복잡한 방법보다 더 pthread에 아무것도하지 않습니다 위해 pthread_join (호출에 블록 - 포인트를 패배).

내 질문은 따라서이다 :

내가 다시 이동 한 후, 다른 기능을 실행 프로세스를 중지, 그것은 내가 몇 밀리 초에 대한의 pthread를 실행할 수 있도록 사용하는 것이있을 것입니다 어떤 기능과 몇 밀리 초 동안 프로세스를 실행 하시겠습니까?

또는

위의 할 수없는 경우, 원래의 문제에 어떤 해결책이?

+1

스레드가 아무것도 수행하지 않기 때문에 블록됩니다. 두 아이디어는 동시에 실행되며 두 가지 모두 유용한 작업을 수행한다는 것입니다. 조인 할 때 주 스레드 블록을 유지하지만 다른 스레드는 실제로 실행 중입니다.이제 조인 전에 주 스레드 (일종의 루프와 같은)에서 실제 작업을 수행해야합니다. –

+0

작업을 수행 할 것입니다 (그러나 코드를 단순하게 유지하려면 무한 루프가 실제로 함수 호출을 에뮬레이션합니다). 실행되는 전체 기간 동안 차단 된 이미 정의 된 클래스 함수를 호출하기 때문입니다. 어떤 의미에서, 프로세서가 이미 하나의 프로세스를 실행하고, 일시 중단하고, 일시 중지하고, 다른 프로세스를 실행하고, 일시 중단 한 다음 원래 프로세스를 실행한다는 점에서 프로세서가 이미 수행하고있는 작업이 있습니다. – SightS2

+0

@ SightS2 정확하게 스레드가하는 일은 무엇입니까? 나는 정말로 당신의 문제를 보지 못합니다. OS는 현재 주 스레드가 조인 할 때까지 스레드간에 스와핑을합니다. 두 번째 스레드 만 활성 상태이지만 아무 것도하지 않기 때문에 볼 수 없습니다! –

답변

0

"메인"스레드는 "차단"스레드가 작업을 완료했을 때만 신경 쓰고 있다고 가정하면 조건 변수를 원한다고 생각합니다. pthread_cond_waitpthread_cond_signal을 살펴보십시오.

0

당신은 항상 3 개 스레드, 각 기능을 더한 메인 스레드 하나를 사용할 수 있습니다.

+0

실시간 스레드와 블로킹 스레드간에 전환 할 수 있는지 확실하지 않은가요? – SightS2

+0

실시간 스레드를 차단하면 차단 스레드가 실행될 수 있고 반대의 경우도 마찬가지입니다. 조건부로 스레드를 차단 및 차단 해제하려면 Mark B에서 제안한 것을 사용할 수 있습니다. – Dikei

0

필요한 것은 대기열 처리 메커니즘입니다. 메인 스레드가 '잡스'를 만듭니다. 그런 다음이 '작업'을 작업자 스레드가 처리하고 처리 할 백 로그 대기열에 배치합니다. 일이 끝나면. 작업자 스레드는 완료된 '작업'을 완료된 대기열에 배치합니다. 주 스레드는 완료된 대기열을 간헐적으로 확인할 수 있으며 완료된 작업이 있으면 '작업'을 선택하여 처리해야하는 작업을 수행합니다. 그러면 작업자 스레드는 다음 작업이 올 때까지 대기 상태가됩니다.

대기열을 롤아웃하는 방법은 다양합니다. 대기열은 유닉스 파이프 일 수 있습니다. 윈도우 IO Completion Port 또는 연결된 목록/배열, 조건부 변수 및 뮤텍스를 사용하여 직접 롤아웃 할 수 있습니다.

관련 문제