我正在尝试为一个C OSX Carbon 多线程应用程序安装一个“崩溃处理程序”。在Windows上,我可以很容易地使用简单而高效的Windows的{} SEH除外,它工作得很好。(注意,这些是无关的与C++异常,这些是较低级别的C结构!)
答案似乎是在每个代码区域之前使用一个setjmp(),然后在出现崩溃时使用一个信号处理程序来将longjmp()返回。
但是实现这一点是不平凡的。因为多线程!Windows中的__try{} __except{}成语是线程安全的,只起作用.但显然setjmp并不是线程安全的。
那么,实现是什么样的呢?我一直在想,我必须实现一些线程本地存储。在开始时,我初始化setjmp,将环境状态存储到线程本地缓冲区中,然后信号处理程序将不得不通过查看线程本地区域再次查找环境数据。但是,无论是Google还是因此都没有证据表明这是正确的策略,特别是因为setjmp()被记录为线程不安全。线程本地存储难道不需要每个线程注册并分配内存(以保存该环境数据),并在线程销毁时释放它吗?
我希望我能制作一个宏,在OSX上将所有这些都封装起来,我的__try __except代码就能工作了。
那么,如何使用信号和setjmp制作OSX多线程安全崩溃恢复处理程序呢?
发布于 2009-03-24 16:41:00
ReactOS有一个名为PSEH的SEH克隆。ROS通讯#49简短地提到了它,您可以看到它是如何在/包括/crt/expt.h、/include/reactos/lib/pseh/pseh2.h等中实现的。
尽管如此,signals+threading交互在UNIX上是非常丑陋的,所以如果您想要SEH的目的是处理信号.我建议你找到另一种解决办法。
发布于 2009-03-24 07:59:48
我使用类似的异常处理,使用setjmp/longjmp,并具有线程本地存储。对于每一个新线程,我都为线程调用初始化函数malloc的本地jmpbuf。
NB!我从未在多线程环境中正确地测试过它!
https://stackoverflow.com/questions/676461
复制相似问题