2012-04-09 45 views
0

我有一个大约6个线程id的数组,我想在一个循环中取消。这是因为我正在面对某些seg故障,因为这些线程在清理后尝试访问一些无效的内存。当我将取消类型更改为asynchronous时,即使在取消线程后,我仍然收到分段错误。如果我将取消类型更改为deferred,并将取消点保留为pthread_join,则在2个线程取消后,我的代码将被连接阻止并且不会退出。取消循环中的pthreads

你能提出什么问题可以解决吗?

/* 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); 
    } 
} 
+0

你能添加相应的代码片段吗? – 2012-04-09 08:55:35

回答

0

我想你误解了延期取消。在你的代码示例中,正在执行取消调用pthread_join的其他线程的线程,该线程不会“调用”取消其他线程。而是取消线程调用取消点时,它实际上终止。

另一方面,当您使用异步取消时,线程终止会立即或多或少发生,但实际上只会或多或少。线程终止不保证在pthread_cancel返回之前发生,因此被取消的线程可能会继续运行一段非常短的时间,并且在正确终止之前有时间进行段错误。也可能是他们已经注册了线程取消回调,这可能也可能是段错误。当然,我不能在不知道细节的情况下说具体细节。

+0

是的,但我的问题解决了。问题是线程正在等待cond变量。 pthread_cond_wait也是一个取消点,它会发出线程信号,然后在收到请求后取消它。线程因此死亡持有互斥锁。当其他线程取消的请求转到pthread_cond_wait时,该线程会等待互斥锁解锁(由死进程保存),并因此永远阻塞自己。作为一个解决方案,我已经实现了自己的清理过程,而不是使用cancel和join。 – 2012-04-11 05:09:48