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);
}
}