gpt4 book ai didi

c - 信号处理程序中的 pthread_exit()

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:57:56 29 4
gpt4 key购买 nike

(这个问题可能与 pthread_exit in signal handler causes segmentation fault 有点相关)我正在编写一个防止线程锁的库,其中始终有一个检查线程在执行图形操作并检查是否存在死锁,如果存在,则它会发出冲突信号之一线程。当该线程捕获到信号时,它会释放它拥有的所有互斥锁并退出。有多个资源互斥锁(显然)和一个临界区互斥锁,所有获取、释放资源锁和进行图计算的调用都必须先获得这个锁。现在问题来了。对于 2 个竞争(不包括检查线程)线程,有时程序会在一个线程被杀死后死锁。在 gdb 中,死线程拥有临界区锁但从未释放过它。在信号处理程序中添加断点并单步执行后,在 pthread_exit() 之前锁似乎属于其他人(正如预期的那样),但所有权在 pthread_exit() 之后神奇地转到了这个线程..

我能想到的唯一猜测是,当试图获得临界区锁时,要被杀死的线程阻塞在pthread_mutex_lock(因为它想要另一个资源互斥锁),然后信号来了,中断了pthread_mutex_lock .由于此调用不是信号保护的,所以发生了奇怪的事情?就像信号处理程序可能已经返回并且该线程获得锁然后退出一样? Idk ..任何见解表示赞赏!

最佳答案

pthread_exit 不是异步信号安全的,因此从信号处理程序调用它的唯一方法是确保信号不会中断任何非异步信号安全功能。

作为一般原则,使用信号作为与线程通信的方法通常是一个非常糟糕的主意。您最终会混淆两个本身就已经很困难的问题:线程安全(线程之间的正确同步)和单个线程内的重入。

如果您使用信号的目的只是指示线程终止,则更好的机制可能是 pthread_cancel。但是,要安全地使用它,将被取消的线程必须在适当的位置设置取消处理程序和/或在不安全时临时禁用取消(使用 pthread_setcancelstate)。另外,请注意 pthread_mutex_lock 不是取消点。没有没有安全的方法来中断被阻塞等待获取互斥量的线程,因此如果您需要这样的可中断性,您可能需要使用条件变量(condvar 等待是可取消的)进行更精细的同步设置,或者您可以使用信号量而不是互斥量。

编辑:如果您确实需要一种方法来终止等待互斥锁的线程,您可以将对 pthread_mutex_lock 的调用替换为调用您自己的循环调用 的函数>pthread_mutex_timedlock 并在每次超时时检查退出标志。

关于c - 信号处理程序中的 pthread_exit(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13687985/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com