杀死后C ++线程还活着吗?

时间:2015-02-07 17:35:13

标签: c++ pthreads

我遇到了一个问题:我创建了一个执行命令行的线程,有时需要花费大量时间等待。所以,我想杀死这个线程并在下面的代码中实现:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
using namespace std;

void* doSomeThing(void *)
{
    cout<<"Begin execute"<<endl;
    system("svn info http://wrong_link_it's_take_a_lot_of_time_to_execute");
    return NULL;
}

int main() {
    pthread_t myThread;

    int err = pthread_create(&myThread,NULL, &doSomeThing,NULL);
    if(err != 0)
    {
        cout<<"Create thread not success"<<endl;
    }

    sleep(2);

    if(pthread_cancel(myThread) == 0)
    {
        cout<<"Thread was be kill"<<endl;
    }

    sleep(3);

    cout<<"End of program";

    return 0;
}

我正在使用pthread_cancel来杀死此线程,并且在执行后始终显示行cout<<"Thread was be kill"<<endl;。这意味着这个线程被杀死了,但是当我在Eclipse上运行它时(我在Ubuntu和Windows 7上都看到了),我看到了惊喜result

任何人都可以向我解释为什么这个线程在杀死之后还活着,你能给我一些方法来解决这个问题。

谢谢。

2 个答案:

答案 0 :(得分:2)

取消某个帖子并不是实际杀死它。它只是要求取消:

   pthread_cancel - send a cancellation request to a thread

(来自man pthread_cancel)。

  

pthread_cancel()函数向其发送取消请求   线程线程。目标线程是否以及何时作出反应   消除          请求取决于该线程控制下的两个属性:其可取消性状态和类型。

答案 1 :(得分:0)

正如Marcus Müllerhis answer所指出的那样,pthread_cancel()并不一定会结束所涉及的主题。

如果你想杀死已经运行的东西,请不要使用system()

  1. 使用fork() / exec*()创建您自己的新子流程。
  2. 如果有时间结束孩子,请让父母在kill() 1返回的PID上发出fork()