无法使用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终止线程的主要内容,如果未能解决你的问题,请参考以下文章

终止线程执行的3种方法(pthread_exit()pthread_cancel()return)

Linux-线程终止-线程等待-线程分离-线程安全

进程环境详解---进程终止和 atexit 函数详解

线程退出时执行函数,处理资源

常用线程控制原语

进程终止,环境表和环境变量操作