0

1 つのループでキャンセルしたい約 6 つのスレッド ID の配列があります。これは、これらのスレッドがクリーンアップ後に無効なメモリにアクセスしようとしたために、特定のセグ フォールトに直面していたためです。キャンセル タイプを に変更するとasynchronous、スレッド キャンセル後もセグメンテーション エラーが発生し続けます。キャンセル タイプを に変更しdeferred、キャンセル ポイントを のままにするとpthread_join、2 回のスレッド キャンセルの後、コードが結合によってブロックされ、終了しません。

何が問題なのか教えてください。

/* The cancel type is deferred and cancellation point is pthread_join. After 2    
iterations, it is unable to come out of join and gets blocked.   Here is the code:*/ 

for (int i=0;i<N_BATCH_THREADS;i++)
{
    rc = pthread_cancel(g_batch_th[i]);
    if(rc!=0)
    {
        fprintf(stderr,"Error in pthread cancel\n");
        exit(1);
    }
    else 
    {
        fprintf(stderr,"Thread cancelled successfully %d\n",g_batch_th[i]);
    }
    rc = pthread_join(g_batch_th[i],&status);
    if(rc!=0) 
    {
        fprintf(stderr,"Error in pthread join\n");
        exit(1);
    }
    else 
    {
        fprintf(stderr,"Return from pthread join successful %d\n",g_batch_th[i]);
    }
    if( status != PTHREAD_CANCELED) 
    {
        fprintf(stderr,"Unexpected thread status \n");
        exit(1);
    }
}
4

1 に答える 1

0

延期されたキャンセルを誤解していると思います。あなたのコード例では、 を呼び出すのは他のスレッドのキャンセルを行っているスレッドでpthread_joinあり、他のスレッドのキャンセルを「呼び出し」ません。実際に終了するのは、キャンセルされたスレッドがキャンセル ポイントを呼び出したときです。

一方、非同期キャンセルを使用すると、スレッドの終了は多かれ少なかれすぐに発生しますが、実際には多かれ少なかれ発生します。スレッドの終了は復帰前に発生するとは保証されていないpthread_cancelため、キャンセルされたスレッドは非常に短い時間実行を継続し、適切に終了する前に segfault する時間が発生する可能性があります。また、スレッド キャンセル コールバックが登録されている可能性もあります。もちろん、詳細を知らずに詳細を語ることはできません。

于 2012-04-11T05:00:21.153 に答える