1

我正在尝试在 SIGSEGV 上实现一个处理程序,它将收集一些信息,例如进程 ID、线程 ID 和回溯,并将这些信息写入文件/管道/套接字。

问题在于,如果一个线程经历了 SIGSEGV,那么其他线程将很快跟进的可能性(可能相当高)​​。如果两个线程碰巧到达了他们同时写出报告的代码位,那么他们将交错写入(到同一个文件)。

我知道我应该只使用 async-signal-safe 功能,如我在此处signal(7) 看到的至少两个案例和此处的最佳答案中链接的视频,其他人曾经解决此问题。pthread_spin_trylock

这是防止上述问题的安全方法吗?

4

1 回答 1

1

在大多数系统上pthread_spin_trylock,将使用原子比较和交换(至少在 x86 上是中断安全的 CAS 指令(不能代表其他人))来实现。

我可能会自己使用 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
于 2012-09-27T18:48:36.000 回答