检查互斥锁是否已锁定

时间:2011-07-05 15:16:43

标签: c linux pthreads

在我的程序中,为了创建一个屏障,主线程将信号发送到所有其他线程。现在,我想检查执行信号处理程序的线程是否在信号处理程序启动时锁定了互斥锁。有没有办法检查信号处理程序内部?

1 个答案:

答案 0 :(得分:5)

阅读您的评论,似乎您的计划比我想象的要复杂得多。如果您有1000个互斥锁,检查它们是否被锁定在信号处理程序中是一个坏主意。事实上,如果你的应用程序是高度线程化的,混合信号和线程也是一个想法,我认为你应该重新考虑。其原因主要在于您无法设置状态标志并以原子方式锁定互斥锁,这将是信号安全的。为了创建适当的条件来支持更新互斥锁的状态条目,以及在不被进程中的信号中断的情况下锁定互斥锁,您将不得不创建一堆代码来包装所有互斥锁。阻止线程可以接收的任何信号的关键部分中的锁定和解锁功能,以便您可以锁定/解锁给定的互斥锁,以及设置/取消设置互斥锁状态的标志,然后可以在信号处理程序中读取该标志

更好的解决方案是只让一个线程接受信号,所有其他线程阻止你发送的信号,包括主线程。然后,您可以简单地将信号发送到整个过程,而不必将信号发送到各个线程。发送信号后,设置用于接收信号并处理它们的唯一线程等待调用sigwait()以获取相应的信号,并在收到后快速检查一组值以查看设置了哪些互斥量,以及哪个特定的线程拥有它们。对于此信息,您的数组可以是值数组,这些值是包含指向互斥锁的指针的结构类型,锁定/解锁标志,以及指向可用于获取线程ID值的线程的pthread_t的指针从。例如,你的struct可能看起来像:

typedef struct mutex_info
{
    pthread_mutex_t* mutex_handle;
    pthread_t* thread_handle;
    int locked;
} mutex_info;

mutex_info mutex_info_array[NUM_MUTEXES];

然后你的其他线程,无需担心异步信号事件,只需在每次锁定或解锁特定互斥锁时更新数组值。