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
}

何が起こっているのかというと、「p」を押して中断しようとすると、画面が「In the while loop」でいっぱいになり、3〜4秒後に停止します。その後、「handler exited 」も表示されません。 rrscheduler が呼び出されました。また、' in the while loop ' が表示されている間、timer() 関数からのステートメントも表示されます。

私の質問は次のとおりです:
1.どうすればスレッドの実行をすぐに終了させることができ
ますか?

4

1 に答える 1

1

キャンセルしようとすると、スレッドが timer() の呼び出しにあるように見えます。タイマーが完了すると、キャンセルされます。pthread_cancel() のマニュアルページによると:

pthread_cancel() 関数は、スレッドのキャンセルを要求します。ターゲット スレッドのキャンセル可能性の状態とタイプによって、キャンセルがいつ有効になるかが決まります。キャンセルが実行されると、スレッドのキャンセル クリーンアップ ハンドラが呼び出されます...

そのため、キャンセルは即時ではありません。timer() の実装によっては、スレッドをすぐにキャンセルできない場合があります。

main() の 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
于 2012-09-13T05:38:37.450 に答える