免费注册 查看新帖 |

Chinaunix

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

关于pthread_cancel能否用别的方法代替 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-22 13:59 |只看该作者 |倒序浏览
最近在移植一个多线程的C程序到android环境下,在pthread_cancel这个函数卡住了,android自己实现了一个pthread库,但是并没有实现
pthread_cancel,所以需要用别的方法来代替,别的几乎都实现了。
我现在的想法是在两个线程间共享一个变量,其中一个线程每循环一次就去check下这个变量,如果是需要cancel掉的,那么线程自己执行pthread_exit。
不知道这样做可行不可行,或者有别的更好的办法,忘达人指教(PS:android下目前用C就是彻底的折磨...)

论坛徽章:
0
2 [报告]
发表于 2009-12-22 14:29 |只看该作者
使用 pthread_cancel 的程序都是很暴力的。太不优雅的,如果线程里面使用了内存分配,将会出现内存泄漏。

论坛徽章:
0
3 [报告]
发表于 2009-12-22 14:42 |只看该作者
直接 return

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
4 [报告]
发表于 2009-12-22 14:47 |只看该作者

回复 #1 babyonetwo 的帖子

win32 thread没有cancel机制, 所以……  如果需要cancel, 用的就是lz的方法

论坛徽章:
0
5 [报告]
发表于 2009-12-22 15:11 |只看该作者
竟然有人在CU说Windows上怎么样怎么样。。。。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
6 [报告]
发表于 2009-12-22 15:26 |只看该作者

回复 #5 unistd 的帖子

原帖由 unistd 于 2009-12-22 15:11 发表
竟然有人在CU说Windows上怎么样怎么样。。。。


原帖由 JohnBull 于 2005-4-13 12:27 发表
成为一个UNIX民间社区是这个网站的主旨和特色,而且本版下属于“→ UNIX平台程序设计交流区 ←”板块(见首页)。所以:
* 凡是有关Win32平台具体技巧及细节的,酌情予以删帖或锁定。
* 凡是与Win32平台具体技巧无关的(如问题的本质在于C语言、算法、数据结构、编程思想之类)则不在我删帖之列,酌情予以锁定或不予处理。


居然有人进CU不看公告帖? 或者你是残疾人士看不懂?
你是版主吗? 不是就请闭上你的鸟嘴

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
7 [报告]
发表于 2009-12-22 15:28 |只看该作者

回复 #3 unistd 的帖子

原帖由 unistd 于 2009-12-22 14:42 发表
直接 return


回帖从来不看帖的?

论坛徽章:
0
8 [报告]
发表于 2009-12-22 16:26 |只看该作者
。。。怎么吵起来了,我这其实只不过要移植到android平台下,google实现的pthread库并没有提供
pthread_cancel,但是我要移植的代码里面用到了,目前我是用一个变量在线程里面判定的,如果发现
被别的线程改掉了,就说明有请求让本线程exit,就调用pthread_exit,但是以前没这么用过,所以心
里很虚-_-!至于内存泄露的话,太紧了,没空去看,至少原来跑的时候应该是好的,我只不过是尽量保持
原有逻辑不变。。。
我这个方法是在线程函数也是自己能够知晓并修改的情况下,看起来是可行的,但是如果要写成jrtp的jthread
库的话就没法这么用。说白了,问题的核心是如何在不用jthread_cancel函数的前提下,写一个函数模拟出
这个功能,不知道有没大人解惑。。。
顺便再问下。。。有人知道怎么在android下用STL么。。。

[ 本帖最后由 babyonetwo 于 2009-12-22 16:35 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2009-12-22 16:38 |只看该作者

回复 #4 OwnWaterloo 的帖子

呵呵,linux下还没有win下的resume,suspend机制呢。。我解决的方法是用条件变量模拟的。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
10 [报告]
发表于 2009-12-22 17:43 |只看该作者

回复 #9 babyonetwo 的帖子

经你一说, 才发现真的没有 ……  尴尬……


pthread不熟, 没有实际使用过。
取消点除了pthread_testcancel还有什么???
pthread_testcancel 可以这么实现:

typedef struct {
      void* (*routine)(void*);
      void* arg;
} my_thread_context;

void* my_thread_routine( void* arg ) {
      my_thread_context* ctx = (my_thread_context*)arg;
      try {
            return ctx->routine( ctx->arg );
      }
      catch ( cancel_thread& ) {
            // cancel成功后, thread的返回代码应该是多少???
      }
}


int my_pthread_create( routine, arg , ... ) {
      my_thread_context ctx = { routine, arg };
      return pthread_create( my_thread_routine, &ctx, ... );
}

void my_pthread_testcancel(void) {
      if ( my_thread_tss( pthread_self() )->cancel )
            throw cancel_thread();
}

void my_pthread_cancel( thread_t thread ) {
      my_thread_tss(thread)->cancel = 1;
}


wait的时候也是取消点???  那就不知道怎么实现了……
cleanup_push那套可以放在throw之前。

[ 本帖最后由 OwnWaterloo 于 2009-12-22 17:45 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP