我遇到了一个问题:我创建了一个执行命令行的线程,有时需要花费大量时间等待。所以,我想杀死这个线程并在下面的代码中实现:
#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
任何人都可以向我解释为什么这个线程在杀死之后还活着,你能给我一些方法来解决这个问题。
谢谢。
答案 0 :(得分:2)
取消某个帖子并不是实际杀死它。它只是要求取消:
pthread_cancel - send a cancellation request to a thread
(来自man pthread_cancel)。
pthread_cancel()函数向其发送取消请求 线程线程。目标线程是否以及何时作出反应 消除 请求取决于该线程控制下的两个属性:其可取消性状态和类型。
答案 1 :(得分:0)
正如Marcus Müller中his answer所指出的那样,pthread_cancel()
并不一定会结束所涉及的主题。
如果你想杀死已经运行的东西,请不要使用system()
。
fork()
/ exec*()
创建您自己的新子流程。 kill()
1返回的PID上发出fork()
。