gpt4 book ai didi

取消循环中的 pthread

转载 作者:行者123 更新时间:2023-11-30 18:00:58 25 4
gpt4 key购买 nike

我有一组大约 6 个线程 id,我想在一个循环中取消它们。这是因为我面临某些段错误,因为这些线程在清理后试图访问一些无效内存。当我将取消类型更改为异步时,即使在线程取消之后,我仍然会遇到段错误。如果我将取消类型更改为 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);
}
}

最佳答案

我认为您误解了延迟取消。在您的代码示例中,正在取消其他线程的线程调用 pthread_join,它不会“调用”其他线程的取消。相反,当被取消的线程调用取消点时,它实际上终止。

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

关于取消循环中的 pthread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10070951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com