免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 26782 | 回复: 9
打印 上一主题 下一主题

线程取消pthread_cancel [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-14 11:38 |只看该作者 |倒序浏览
请问,我在用pthread_cancel函数取消一个线程时,但该线程并没有设置取消点,可是运行出来的结果却和理论值两样。因为我在线程中用了一个for(;;),照理该线程应该一直循环下去,可是该线程却可以退出。该程序如下:
#include <stdio.h>
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
int fd;
char buf[40];
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;

void *search(void *arg)
{
int d=0;
for(;
printf("d=%d\n",d++);
printf("\nend\n";
}
int main()
{
pthread_t tid;
pthread_create(&tid,NULL,search,NULL);
pthread_cancel(tid);
printf("the main end\n";
pthread_join(tid,NULL);
printf("the cancel prom is over\n";
}
还望各位指点! 谢谢!!

论坛徽章:
0
2 [报告]
发表于 2007-03-14 12:39 |只看该作者
posix的线程有两中取消模式,立即取消和延迟取消.
立即取消是你调用pthread_cancel的时候,不管线程当前正在干什么,马上被结束掉.
延迟取消是在你调用pthread_cancel以后,线程运行到一个取消点函数的时候才会结束.

你看看你线程的是不是立即取消模式啊
pthread_sercanceltype

论坛徽章:
0
3 [报告]
发表于 2007-03-14 13:56 |只看该作者
上述程序中线程属性是默认的,即其线程取消动作是运行至取消点。

论坛徽章:
0
4 [报告]
发表于 2010-06-04 16:12 |只看该作者
你的线程回调函数中就是线程取消点,只有在读和写之类的阻塞调用时才不是线程取消点。如果想保护线程的处理可以用pthread_setcancelstate来关闭和打开线程取消功能。

论坛徽章:
0
5 [报告]
发表于 2010-06-04 23:22 |只看该作者
关注一下

论坛徽章:
0
6 [报告]
发表于 2011-11-04 10:31 |只看该作者
pthread_join()也是线程取消点之一。

论坛徽章:
0
7 [报告]
发表于 2011-12-05 12:43 |只看该作者
printf函数调用了带取消点函数。可以这样测试:线程while (1 )空循环,另外一个线程pthread_cancel 然后 pthread_join, 如果 pthread_join 阻塞,那么证明 printf 确实调用了带取消点的系统调用函数。

论坛徽章:
0
8 [报告]
发表于 2012-04-20 13:20 |只看该作者
本帖最后由 yjf_victor 于 2012-04-20 13:21 编辑

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

void * threadFunc ( void * args )
{
        /* 一些可能让线程死锁的代码 */
        return NULL;
}

int main (void)
{
        pthread_t mythread;
        if ( pthread_create(&mythread, NULL, threadFunc, NULL ) )
        {
                printf ( "Error Creating Thread.\n" );
                return 1;
        }
        sleep(3);
        /* 强制结束线程mythread,代码怎么写?  */
        return 0;
}

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
9 [报告]
发表于 2012-12-13 16:18 |只看该作者
printf("d=%d\n",d++);   

read()、write()、open()、close()皆为取消点,printf()库函数调用了左面的几个系统调用,所以,当线程运行到printf时,就取消了。

楼主可以把printf()注释掉,然后就会发现程序一直在循环不会退出了。

论坛徽章:
0
10 [报告]
发表于 2012-12-13 21:49 |只看该作者
学习啦!!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP