Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 检查互斥锁是否已锁定_C_Linux_Pthreads - Fatal编程技术网

C 检查互斥锁是否已锁定

C 检查互斥锁是否已锁定,c,linux,pthreads,C,Linux,Pthreads,在我的程序中,为了创建屏障,主线程向所有其他线程发送信号。现在,我想检查执行信号处理程序的线程在信号处理程序启动时是否锁定了互斥锁。有没有办法在信号处理程序中检查这一点?仔细阅读您的评论,您的程序似乎比我想象的要复杂得多。如果您有1000个互斥体,检查它们是否被锁定在信号处理程序中是一个坏主意。事实上,如果你的应用程序是如此的线程化,混合信号和线程也是一个想法,我认为你应该重新考虑。这主要是因为无法设置状态标志并以信号安全的原子方式锁定互斥锁。为了创建适当的条件来支持更新互斥体的状态条目,以及在

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

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

一个更好的解决方案是只有一个线程接受信号,而所有其他线程都阻止您发送的信号,包括主线程。然后,不必向单个线程发送信号,只需向整个进程发送信号即可。在发送信号时,唯一设置用于接收信号并处理信号的线程通过调用
sigwait()
等待适当的信号,并在收到信号后快速检查一组值,以查看设置了哪些互斥锁,以及哪个特定线程拥有这些互斥锁。对于此信息,数组可以是一个值数组,它是一种结构类型,包含指向互斥体的指针、锁定/解锁标志,以及指向可用于从中获取线程ID值的线程的pthread_t的指针。例如,您的结构可以类似于:

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

mutex_info mutex_info_array[NUM_MUTEXES];

然后,您的其他线程不必担心异步信号事件,只要在每次锁定或解锁特定的互斥锁时更新数组值即可。

根据我所读的内容,在信号处理程序中除了设置标志或类似内容之外,做很多事都是危险的。使用pthread\u mutex\u trylock(),我需要将互斥量作为参数传递。这不好,因为假设我的程序有1000个互斥体,我不会调用pthread_mutex_trylock()1000次来检查每个互斥体。如果有互斥锁被处理信号处理程序的线程锁定,那么没有任何方法可以不检查每个互斥锁就知道它们被锁定了吗?我想到的一种方法是记录某个队列中的互斥锁被锁定的信息,并在信号处理程序中读取该队列。显然,我需要为此创建一个包装函数,它不仅锁定互斥体,而且还记录此信息。“您可以在信号处理程序中调用pthread_mutex_trylock()”——不太可能,因为它不在异步信号安全函数列表中。这个答案至少有两个错误。。。首先,仅为“错误检查”互斥体提供
EDEADLK
。其次,正如@Steve指出的,pthread函数通常不在列表中。好的,我已经根据响应更新了我的答案。请让我知道这个解决方案是否更有效。。。还有@Nemo,谢谢你的提示。。。我现在看到,如果互斥类型是
PTHREAD\u mutex\u NORMAL
,就会出现死锁,这是一个非常糟糕的想法。