我无法终止线程,即使关闭终端后它也会继续发送...
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;
}
有人能告诉我我做错了什么吗? 谢谢!
答案 0 :(得分:2)
pthread_exit
会杀死你当前的帖子。
请注意,如果您像处理主线程一样终止,它不会终止进程。其他线程继续运行。
您可能想要使用pthread_cancel
。
更一般地说,杀死线程是一个坏主意。正确的方法是礼貌地要求你的线程终止并等到他们这样做。
答案 1 :(得分:1)
如果从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\n");
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
}
sleep(1);
printf("count:%d\n", count);
count ++;
}
return 0;
}
在代码中使用sleep
来理解。
答案 2 :(得分:0)
我的理解:
从“man pthread_exit”中清楚地谈到描述和理性行为。
我们需要清理在创建的线程中使用的所有受尊重的资源。 “pthread_exit()函数将终止调用线程,并使值value_ptr可用于与终止线程的任何成功连接。”
我们将“value_ptr”传递给exit(value_ptr) - &gt;这将有助于分析退出流程的结果。
显然exit() - 从进程退出调用,将释放用于的资源。
另一方面,您可以在分离状态下创建pthread,此属性将在pthread_exit时隐式回收资源。请参阅“man pthread_detach”。
我们不需要使用pthread_join ..再次去pthread_detach它的简单的go ahead set属性。
/ *设置线程分离状态* / ret = pthread_attr_setdetachstate(&amp; tattr,PTHREAD_CREATE_DETACHED);
感谢。 桑卡尔
答案 3 :(得分:0)
您的pthread_exit()
退出当前主题。 parameter is used to pass a return value到任何想要加入它的线程 - 而不是像代码所暗示的那样指定要退出的线程。
执行所需操作的最佳方法是使用主线程中的pthread_cancel()
。它将线程作为参数取消,然后向该线程发送取消请求。但请注意,默认情况下取消是延迟的,因此您的线程将继续运行,直到它遇到cancellation point的函数 - 如果您不使用任何这些函数,则可以插入显式取消点致电pthread_testcancel()
。
如果你需要进行一些清理(例如对free
分配的内存,解锁互斥锁等),你可以插入一个在取消线程时自动调用的清理处理程序。为此,请查看pthread_cleanup_push()
。
您还可以将线程设置为使用异步取消 - 然后可以立即取消您的线程,而无需点击取消点。但是,只有在您根本不使用任何系统调用时才应使用异步取消(也就是说,如果您纯粹对已有数据进行计算,则可以使用 - 但如果您使用{{1} },文件I / O,套接字通信或类似的),否则您将冒险系统以不一致的状态结束。
调用printf
后,主线程应在取消的线程上调用pthread_join()
,以确保清除所有线程资源(除非您将线程创建为已分离)。
当然,您也可以在两个线程之间只有一个共享的pthread_cancel()
标志,主线程可以设置,另一个线程会不时查看。它基本上是一种使用doExit
的手动方式。