一个线程如何终止另一个线程

qxh0724 2010-09-27 11:55:42
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <pthread.h>


typedef struct arg ARG;
struct arg{
int arg_1;
};

void *f(void *arg){


pthread_t tid;
tid=pthread_self();
int i;


ARG *p=(ARG *)arg;
for(i=0;i<10000000;i++){
if(p->arg_1==i){
printf("%d\n",p->arg_1);
pthread_exit((void*) 1);
//我想此时把线程2也终止了,如果用pthread_cancel的话不知道另外一个线程的id
}else{
return NULL;
}
}
}


int main(){


pthread_t tid_1,tid_2;
ARG myarg_1,myarg_2;
int err;
void *res_1,*res_2;

tid_1=pthread_self();

myarg_1.arg_1=10;


//创建第一个线程
err=pthread_create(&tid_1,NULL,f,(void *)&myarg_1);
if(err!=0){
printf("%s\n",strerror(err));
exit(1);
}


tid_2=pthread_self();
myarg_2.arg_1=1000000;


//创建第二个线程
err=pthread_create(&tid_2,NULL,f,(void *)&myarg_2);
if(err!=0){
printf("%s\n",strerror(err));
exit(1);
}



err=pthread_join(tid_1,&res_1);
err=pthread_join(tid_2,&res_2);

return 0;
}

比如上面的例子,我调用两个线程分别传两个不同的值过去,我想在满足10的时候就终止所有线程,终止该线程本身,我知道,但是终止另外一个线程怎么做。
...全文
745 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
孤独小剑 2011-04-28
  • 打赏
  • 举报
回复
楼猪可以定义一个全局变量,比如0表示还未找到1表示已找到,各个线程不是每读一行判断一次嘛,那就读一行数据之后先查看下是否已经找到了。如果搜索完毕还也每找到直接退出这个线程就可以了。
孤独小剑 2011-04-28
  • 打赏
  • 举报
回复
跟你遇到的问题差不多,我是开了一个线程去下东西,然后在下的时候如何终止这个下载线程你那个好像还可以设置一个变量while里判断一下,而我这个线程是一只在下东西没时间去做判断,纠结啊……
孤独小剑 2011-04-28
  • 打赏
  • 举报
回复
收录了一篇文章:http://blog.csdn.net/gdujian0119/archive/2011/04/28/6370389.aspx
qxh0724 2010-09-27
  • 打赏
  • 举报
回复
你们可能没理解我的问题,我举个例子吧,比如我现在有a.txt 和 b.txt 两个文本文件,假设文件中的每一行都是保存的IP地址,例如a.txt内容如下:
192.168.0.1^北京
192.168.0.2^上海
192.168.0.3^天津
192.168.0.4^广州
192.168.0.5^河北
.....
可能一共有10万条记录。

同样,b.txt的内容也是这样。

我现在要实现的功能是根据ip地址得出地区,如果放在一个文件中的话,就是20万条记录。我现在分成两个文件,用两个线程去分析,提高效率。当在一个文件中查找到相应记录时,立即终止线程,同时把另外一个线程也终止。

不知我上述表达大家是否能明白
乐CC 2010-09-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 luoqi 的回复:]
bool stop1=false;

//thread1
while(!stop1){
}

//thread2
stop1=true;
[/Quote]
支持这种方法,最好使用标志位,自动退出,强制退出会很多问题的
luoqi 2010-09-27
  • 打赏
  • 举报
回复
直接杀掉,会有问题的,,至少N多书上都是这么说
luoqi 2010-09-27
  • 打赏
  • 举报
回复
bool stop1=false;

//thread1
while(!stop1){
}

//thread2
stop1=true;
qxh0724 2010-09-27
  • 打赏
  • 举报
回复
楼上的能否具体一点,给点代码案例。

还有一个问题,能否获得一个进程下的所有线程信息,包括线程id
ayw215 2010-09-27
  • 打赏
  • 举报
回复
线程同步,condition
NKLoveRene 2010-09-27
  • 打赏
  • 举报
回复
这不就是楼上写的那些么
找个标志位
bFindIt
为false的时候就继续运行
为true的时候就退出线程
[Quote=引用 6 楼 qxh0724 的回复:]
你们可能没理解我的问题,我举个例子吧,比如我现在有a.txt 和 b.txt 两个文本文件,假设文件中的每一行都是保存的IP地址,例如a.txt内容如下:
192.168.0.1^北京
192.168.0.2^上海
192.168.0.3^天津
192.168.0.4^广州
192.168.0.5^河北
.....
可能一共有10万条记录。

同样,b.txt的内容也是这样。
……
[/Quote]
wind_breez 2010-09-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 void_wuyu 的回复:]

引用 3 楼 luoqi 的回复:
bool stop1=false;

//thread1
while(!stop1){
}

//thread2
stop1=true;

支持这种方法,最好使用标志位,自动退出,强制退出会很多问题的
[/Quote]

顶这个,如果用terminatethread,线程堆栈也是没撤销。

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧