免费注册 查看新帖 |

Chinaunix

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

[C] 线程中一段代码不允许强制退出 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-25 10:00 |只看该作者 |倒序浏览
线程1
thread1()
{

A{
...
}

}
如何保证在执行线程1中一段代码A{}时,线程1不允许被其他线程kill掉(在A之前或之后可以被kill掉)?

论坛徽章:
0
2 [报告]
发表于 2009-08-25 10:10 |只看该作者
这种需求是没有意义的。
因为,如果其他线程如果内存错误,整个进程都要退出,没有哪个线程可以幸免。
如果忽然断电,整台机器都会关掉,没什么代码可以保证得到执行。

没有什么机制可以保证某个代码块一定得到完整执行。你需要考虑的是如何恢复现场。

[ 本帖最后由 wwwsq 于 2009-8-25 10:12 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-08-25 10:39 |只看该作者

回复 #2 wwwsq 的帖子

可是我看PostgreSQL的代码Miscadmin.h里面有两个宏HOLD_INTERRUPTS(),RESUME_INTERRUPTS(),能保证之间的代码不被cancel或die掉。

论坛徽章:
0
4 [报告]
发表于 2009-08-25 10:43 |只看该作者
原帖由 4seas 于 2009-8-25 10:39 发表
可是我看PostgreSQL的代码Miscadmin.h里面有两个宏HOLD_INTERRUPTS(),RESUME_INTERRUPTS(),能保证之间的代码不被cancel或die掉。



这应该只是屏蔽中断或者singals。这可以减少线程执行被打断的概率,但是不能保证。

PostgreSQL一定还有其他方式来恢复现场。

论坛徽章:
0
5 [报告]
发表于 2009-08-25 10:46 |只看该作者
"The HOLD_INTERRUPTS() and RESUME_INTERRUPTS() macros
allow code to ensure that no cancel or die interrupt will be accepted,
even if CHECK_FOR_INTERRUPTS() gets called in a subroutine."


这只是屏蔽了两个信号而已。

论坛徽章:
0
6 [报告]
发表于 2009-08-25 10:53 |只看该作者
发表下自己的浅见,我觉得可以作成同期接口,保证A在执行中
不被打断,必须等待A执行完后,其他的事件才能割入。
例如在rex系统中:
thread1()
{
REX_INTLOCK();
A{
...
}
REX_INTFREE();
}

保证在A的执行过程中不会被中断。

论坛徽章:
0
7 [报告]
发表于 2009-08-25 12:51 |只看该作者
算了,做个检测,如果KILL,先把A()KILL掉

论坛徽章:
0
8 [报告]
发表于 2009-08-25 12:57 |只看该作者
不如讨论下,一个项目,在什么情况可以使用 pthread_cancel

论坛徽章:
0
9 [报告]
发表于 2009-08-25 19:08 |只看该作者
在线程启动时就加锁,执行完A后解锁,要pthread_cancel先得判断此锁
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP