2012-09-12 3 views
0

병렬 실행 스레드를 구현했습니다. 원하는 것은 사용자가 'p'라고 말하면 버튼을 누를 때마다 즉시 스레드가 멈춰야한다는 것입니다.즉시 스레드 종료

내 코드 :

bool b=false; 
pthread_t thread1=0; 

void handlerforfunc3(void* arg) 
{ 
b=true; 
cout<<"Handler exited"<<endl; //this was not output when 'in the while loop' stopped printing' 
} 

void handler() 
{ 
cout<<"PROCESS HAS ENTERED THE HANDLER"<<endl; 

rrscheduler(ready, job); 
} 

void* func3(void *arg) 
{ 
pthread_cleanup_push(handlerforfunc3, NULL); 
timer(arg); //timer() is a function called in the thread 
handler(); 
pthread_cleanup_pop(0); 
} 


void rrscheduler() 
{ 
    pthread_create(&thread1, NULL, func3, (void*)(arg1)); 
} 

int main() 
{ 
    while(1) 
    { 
    char c=cin.get(); 
    switch(c) 
    { 
    case 'p': 
    if(thread1!=0) 
    { 
    pthread_cancel(thread1); 
    while(!b) 
    { 
     cout<<"in the while loop"<<endl; 
    } 
    } //thread1!=0 

    b=false; 
    rrscheduler(); 

    }//switch ends 
    } //while ends 
} 

무엇이 일어나는 것은 내가 'while 루프에서'화면 가득를 'P'를 누름으로써 방해하려고 할 때마다 연속적으로 다음 후에 멈추는 디스플레이되고 있다는 것이다 3-4 s.And 그 후도 '처리기 종료'도 표시되지 않으며 rrscheduler도 호출되지 않습니다. 또한 'while 루프'에 이 표시되는 동안 timer() 함수의 명령문도 표시됩니다.

내 질문이다 :
이 1.how 내가 스레드가 즉시
2.Why 주 우리는 while 루프 나가 후 실행되지에서 rrscheduler입니다 실행을 종료 될 수 있습니다 (b는 사실이다 후) ?

답변

1

취소하려고 할 때 스레드가 timer() 호출에있는 것처럼 보입니다. 타이머가 완료되면 취소해야합니다. pthread_cancel() man page에 따르면 :

pthread_cancel() 함수는 스레드가 취소되도록 요청합니다. 타겟 thread의 취소 가능성 상태 및 타입에 의해, 언제 취소가 유효한가가 결정됩니다. 취소 작업이 수행되면 스레드에 대한 취소 정리 처리기가 호출됩니다.

따라서 취소는 즉시 발생하지 않습니다. timer()의 구현에 따라 스레드를 즉시 취소 할 수 없을 수도 있습니다.

의 rrscheduler() 함수()는 while 루프 나가 후 thread1 0으로 할당되지 않습니다 다음과 같이 할당해야하기 때문에 실행되지 주 :

if(thread1!=0) 
{ 
    pthread_cancel(thread1); 
    while(!b) 
    { 
    cout<<"in the while loop"<<endl; 
    } 
    thread1 = 0; // <== assigning to 0 here 
} //thread1!=0