Chinaunix

标题: 线程中一段代码不允许强制退出 [打印本页]

作者: 4seas    时间: 2009-08-25 10:00
标题: 线程中一段代码不允许强制退出
线程1
thread1()
{

A{
...
}

}
如何保证在执行线程1中一段代码A{}时,线程1不允许被其他线程kill掉(在A之前或之后可以被kill掉)?
作者: wwwsq    时间: 2009-08-25 10:10
这种需求是没有意义的。
因为,如果其他线程如果内存错误,整个进程都要退出,没有哪个线程可以幸免。
如果忽然断电,整台机器都会关掉,没什么代码可以保证得到执行。

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

[ 本帖最后由 wwwsq 于 2009-8-25 10:12 编辑 ]
作者: 4seas    时间: 2009-08-25 10:39
标题: 回复 #2 wwwsq 的帖子
可是我看PostgreSQL的代码Miscadmin.h里面有两个宏HOLD_INTERRUPTS(),RESUME_INTERRUPTS(),能保证之间的代码不被cancel或die掉。
作者: wwwsq    时间: 2009-08-25 10:43
原帖由 4seas 于 2009-8-25 10:39 发表
可是我看PostgreSQL的代码Miscadmin.h里面有两个宏HOLD_INTERRUPTS(),RESUME_INTERRUPTS(),能保证之间的代码不被cancel或die掉。



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

PostgreSQL一定还有其他方式来恢复现场。
作者: wwwsq    时间: 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."


这只是屏蔽了两个信号而已。
作者: 想念水的鱼    时间: 2009-08-25 10:53
发表下自己的浅见,我觉得可以作成同期接口,保证A在执行中
不被打断,必须等待A执行完后,其他的事件才能割入。
例如在rex系统中:
thread1()
{
REX_INTLOCK();
A{
...
}
REX_INTFREE();
}

保证在A的执行过程中不会被中断。
作者: aaaaa5aa    时间: 2009-08-25 12:51
算了,做个检测,如果KILL,先把A()KILL掉
作者: 群雄逐鹿    时间: 2009-08-25 12:57
不如讨论下,一个项目,在什么情况可以使用 pthread_cancel
作者: rollin7    时间: 2009-08-25 19:08
在线程启动时就加锁,执行完A后解锁,要pthread_cancel先得判断此锁




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2