免费注册 查看新帖 |

Chinaunix

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

关于pthread库和和unix信号 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-17 10:42 |只看该作者 |倒序浏览
最近用c++的cocos2d-x引擎写跨平台游戏。。其中有大量网络下载部分,既然是跨平台只能pthread库了。
于是按NSThread库的风格封装了类似的玩意
比如:
void *threadFun(void *data)
{
        taget_t  *tg = (taget_t*)data;
        SelectorProtocol  *obj = tg->obj;
        SEL_CallFuncO fun = tg->mem;

       
        (obj->*fun)((CCObject*)tg->arg);

       
        delete tg;
       
        return NULL;
}



void CSThread::detachNewThread(SelectorProtocol *taget, SEL_CallFuncO fun,  CCObject *object)
{
        taget_t  *tg = new taget_t();

        tg->obj = taget;
        tg->mem = fun;
        tg->arg = object;

        pthread_t td;

        pthread_attr_t at;
        pthread_attr_init(&at);
        pthread_attr_setdetachstate(&at, PTHREAD_CREATE_DETACHED);


        pthread_create(&td, &at, threadFun, (void*)tg);
        pthread_attr_destroy(&at);
}


然后我在ui线程注册SIGCHLD信号处理函数,并封装了一个perfromOnMainThread的c++方法,将传进去的obj->*fun相关数据放到自定的消息队列里。 然后朝ui线程发射pthread_kill( ui_id, SIGCHLD)来启动注册的信号处理函数。

但是在信号处理函数处理情况下还有很多SIGCHLD信号,信号处理函数只会响应一次!

根据posix.1实时扩展,内核有可能会实现信号排队机制,但我的平台几乎都没有实现。

请问还有什么好的可移植的办法让我能通知主线程么?设标识位轮询除外,平台gui原生消息循环系统除外

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
2 [报告]
发表于 2012-03-17 12:43 来自手机 |只看该作者
信号就算不是排队的,似乎也不是说在信号处理返回前一律忽略,而是不还没有进入处理前忽略重复信号,这个我记得如此。
ios没那么弱,实时信号'似乎是支持的。但sigchld不属于实时信号,无论ios对其是否排队,都不是可跨平台的做法,不妨换一个信号试试。
如果你确定在你上下文下用信号处理能模拟PostMessage语义而无重入之类问题,那么干嘛不试着在处理时一次处理完所有待执行动作呢?

论坛徽章:
0
3 [报告]
发表于 2012-03-17 13:05 |只看该作者
zylthinking 发表于 2012-03-17 12:43
信号就算不是排队的,似乎也不是说在信号处理返回前一律忽略,而是不还没有进入处理前忽略重复信号,这个我 ...


感谢大侠指点,我确定我的上下文无可重入问题。
实时信号的问题我打开SA_SIGINFO标志位也没能成功排队。。根据apue的说法,SIGCLD/SIGCHLD 理论上是实时排队信号,但好像从来没实现过?
至于其他信号有那种是实时的?

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
4 [报告]
发表于 2012-03-17 13:08 来自手机 |只看该作者
所有你叫的上名字的, 或者至少在apue岀现过的, 都不是实时信号。

论坛徽章:
0
5 [报告]
发表于 2012-03-17 13:38 |只看该作者
zylthinking 发表于 2012-03-17 13:08
所有你叫的上名字的, 或者至少在apue岀现过的, 都不是实时信号。


测试了一下,至少OS X和iOS没实现SIGRTMIN/SIGRTMAX。。。。


论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
6 [报告]
发表于 2012-03-17 13:44 来自手机 |只看该作者
google 一下吧,没仔细研究过mac的信号,只偶尔看了一眼。如果二楼第二条是错误的, 那第一条和第三条如果是对的我想也能解决你的问题吧

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
7 [报告]
发表于 2012-03-17 13:59 |只看该作者
看你的描述,应该是线程间的同步问题吧,考虑下条件变量或信号量
实时信号是UNIX系统(OS X 10.5+)可选实现,移植性一般
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP