我正在尝试实现一个处理程序,该处理程序将在SIGSEGV上收集一些信息,如进程id、线程id和回溯,并将这些信息写入文件/管道/套接字。
问题在于,如果一个线程出现SIGSEGV,那么其他线程很快就会出现这种情况的可能性(可能相当高)。如果两个线程碰巧同时到达编写报告的代码位,那么它们将交错写入(同一文件)。
我知道我应该只使用signal(7)
中详细介绍的异步信号安全功能我在这里也看到了至少两个案例,并在这里的顶部答案中链接了视频,其他人使用pthread_spin_trylock
来解决这个问题。
这是防止上述问题的安全方法吗
在大多数系统上,pthread_spin_trylock
将使用原子compare-and-swap(CAS指令实现,该指令至少在x86上是中断安全的(不能代表其他系统)。
我可能会亲自使用CAS来确保这就是发生的事情。以下是它的gcc文档:http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html
示例代码:
static int lock = 0; // global scope
在您的信号处理程序中:
if (__sync_bool_compare_and_swap(&lock, 0, 1)) {
// Got the lock
} else
pthread_exit(); // terminate this thread