(这个问题可能与信号处理程序中的 pthread_exit 导致分段错误有关)我正在编写一个引导锁预防库,其中始终有一个检查线程执行图形操作并检查是否存在死锁,如果是,则它发出信号之一冲突的线程。当该线程捕获信号时,它会释放它拥有的所有互斥体并退出。有多个资源互斥体(显然)和一个临界区互斥体,所有获取、释放资源锁和进行图计算的调用都必须首先获得该锁。现在问题来了。如果有 2 个竞争线程(不包括检查线程),有时程序会在一个线程被杀死后陷入死锁。在 gdb 中,它表示死线程拥有临界区锁,但从未释放它。在信号处理程序中添加断点并单步执行后,似乎锁在 pthread_exit() 之前属于其他人(如预期),但所有权在 pthread_exit() 之后神奇地转到了该线程。
我能想到的唯一猜测是要被杀死的线程在尝试获取关键区域锁时阻塞在 pthread_mutex_lock 处(因为它需要另一个资源互斥锁),然后信号到来,中断 pthread_mutex_lock。由于这个调用没有信号防护,所以发生了奇怪的事情?就像信号处理程序可能已经返回并且该线程获得锁然后退出一样?Idk..任何见解表示赞赏!
我有以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_t test_thread;
void *thread_test_run (void *v)
{
int i=1;
while(1)
{
printf("into thread %d\r\n",i);
i++;
sleep(1);
}
return NULL
}
int main()
{
pthread_create(&test_thread, NULL, &thread_test_run, NULL);
sleep (20);
pthread_cancel(test_thread);
sleep(100);
// In this period (before the finish of myprogram),
// I execute killall to kill myprogram
// I want to add a signal handle function to
// execute pthread_exit() before the program quit
}
Run Code Online (Sandbox Code Playgroud)
我想通过添加一个信号处理函数来在程序退出之前执行 pthread_exit() 来完成我的代码。
怎么做 ?