0

我有一个大约 6 个线程 ID 的数组,我想在一个循环中取消它们。这是因为我面临某些段错误,因为这些线程在清理后试图访问一些无效内存。当我将取消类型更改为时asynchronous,即使在线程取消之后,我仍然会遇到分段错误。如果我将取消类型更改为deferred并将取消点保持为pthread_join,则在 2 个线程取消后,我的代码会被 join 阻塞并且它不会退出。

你能建议问题是什么吗?

/* 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返回之前发生,因此被取消的线程很可能会继续运行一小段时间,并且在它们被正确终止之前有时间进行段错误。也可能是他们注册了线程取消回调,这也可能是段错误。我当然不能在不知道细节的情况下谈论细节。

于 2012-04-11T05:00:21.153 回答