c-pthread_spin_trylock在多线程应用程序的sigsegov处理程序中是否安全



我正在尝试实现一个处理程序,该处理程序将在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

相关内容

  • 没有找到相关文章

最新更新