无法使用pthread_exit终止线程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法使用pthread_exit终止线程相关的知识,希望对你有一定的参考价值。
我无法终止线程,它甚至在我关闭终端后仍然发送信息......
void *RTPfun(void * client_addr);
int main(int argc, char *argv[])
{
pthread_t RTPthread;
pthread_create(&RTPthread, NULL, &RTPfun, (void*)client_addr);
...
...
pthread_exit(&RTPfun);
return 0;
}
void *RTPfun(void * client_addr)
{
...
...
return 0;
}
有人能告诉我我做错了什么吗?谢谢!
pthread_exit
杀死你当前的线程。
请注意,如果您按原样终止主线程,则不会终止该进程。其他线程继续运行。
你可能想用pthread_cancel
。
更一般地说,杀死线程是一个坏主意。正确的方法是礼貌地要求你的线程终止并等到他们这样做。
如果从main调用exit()
,它将终止所有其他线程的主线程。
如果从主服务器调用pthread_exi()t
,它将终止主线程并让其他线程连续运行。
在你的情况下,你从main调用pthread_exit(),所以你的主线程终止,其他线程运行,直到线程完成工作。
要取消线程在RTPfun中添加以下内容并在main中添加pthread_cancel。
/ *当你还没准备好取消线程时调用它* / pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
/ *当你准备好取消线程时调用它* / pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
工作示例代码:
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
void *RTPfun(void * client_addr);
int main(int argc, char *argv[])
{
pthread_t RTPthread;
int client_addr;
pthread_create(&RTPthread, NULL, &RTPfun, (void*)client_addr);
sleep(2);
pthread_cancel(RTPthread);
pthread_join(RTPthread, NULL);
return 0;
}
void *RTPfun(void * client_addr)
{
int count = 0;
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
while(1) {
if(count > 10) {
printf("thread set for cancel
");
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
}
sleep(1);
printf("count:%d
", count);
count ++;
}
return 0;
}
在代码中使用sleep
进行理解。
我的理解:
从“man pthread_exit”中可以清楚地谈到描述和理性行为。
我们需要清理创建的线程中使用的所有受尊重的资源。 “pthread_exit()函数将终止调用线程,并使值value_ptr可用于与终止线程的任何成功连接。”
我们将“value_ptr”传递给exit(value_ptr) - >这将有助于分析退出过程的结果。
显然exit() - 调用退出进程,将释放用于的资源。
换句话说,您可以在分离状态下创建pthread,此属性将在pthread_exit时隐式回收资源。请参阅“man pthread_detach”。
我们不需要使用pthread_join ..或者再去pthread_detach它的简单的go ahead set属性。
/ *设置线程分离状态* / ret = pthread_attr_setdetachstate(&tattr,PTHREAD_CREATE_DETACHED);
谢谢。混合动力
你的pthread_exit()
退出当前线程。 parameter is used to pass a return value到任何想要加入它的线程 - 而不是像你的代码所暗示的那样指定要退出的线程。
做你想做的最好的方法是使用主线程中的pthread_cancel()
。它将线程作为参数取消,然后向该线程发送取消请求。请注意,默认情况下取消是延迟的,因此您的线程将继续运行,直到它遇到一个cancellation point函数 - 如果您不使用任何这些函数,您可以通过调用pthread_testcancel()
插入一个显式取消点。
如果你需要做一些清理(例如free
分配的内存,解锁互斥锁等),你可以插入一个在取消线程时自动调用的清理处理程序。看看pthread_cleanup_push()
这个。
您还可以将线程设置为使用异步取消 - 然后可以立即取消您的线程,而无需点击取消点。但是,只有在你根本不使用任何系统调用时才应该使用异步取消(也就是说,如果你纯粹在已经可用的数据上进行计算就没关系 - 但是如果你使用的是printf
,那就没有了,文件我/ O,套接字通信或类似的),否则您将冒着系统最终处于不一致状态的风险。
在调用pthread_cancel()
之后,您的主线程应该在取消的线程上调用pthread_join()
,以确保清除所有线程资源(除非您将线程创建为已分离)。
你当然也可以在两个线程之间只有一个共享的doExit
标志,主线程可以设置,另一个线程不时查看。它基本上是一种使用pthread_cancel()
的手动方式。
以上是关于无法使用pthread_exit终止线程的主要内容,如果未能解决你的问题,请参考以下文章