无法使用pthread_exit终止线程

时间:2014-01-29 10:01:50

标签: c multithreading pthreads

我无法终止线程,即使关闭终端后它也会继续发送...

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;
 }

有人能告诉我我做错了什么吗? 谢谢!

4 个答案:

答案 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的手动方式。