我想知道从信号处理程序访问共享数据是否是个好主意。我的意思是考虑具有单个进程的多进程系统和多线程系统的场景。在多进程系统中,可以说我让进程处理特定的信号并由进程更新某些共享变量或内存。我可以从信号处理程序本身执行此操作吗?

但是,在使用pthreads的线程的情况下,我认为这是不可行的。 http://maxim.int.ru/bookshelf/PthreadsProgram/htm/r_40.html。如本文所述,他们已经提到它不是异步信号安全的,因此建议使用sigwait。我不是为什么它不是异步信号安全的。我的意思是说,我通过线程处理信号,并且在信号处理程序路由中。我获得了共享内存上的锁以对其进行更新。同时,另一个相同类型的信号到达,另一个负责处理它的线程再次执行信号处理程序。此处的信号处理程序与该过程相同,但称为多次。第二次,它看不到锁并更新/覆盖数据。这是使用共享数据的多线程信号处理程序的问题吗?

我有点困惑,在多进程系统中,我为每个进程都有一个信号处理程序的副本。但是在多线程系统中,不是多个线程使用的信号处理程序的单个副本。因此,当多个相同类型的信号到达并且我们有两个负责处理它的线程尝试处理它时,它们两个都将尝试执行同一条处理程序代码吗?怎么适合呢?

最佳答案

我通读了您所引用的文章,并在“信号处理程序中的线程”的部分中找到了一些有趣的信息。在该部分中,您将看到它们具有可以从信号处理程序中进行的Posix函数调用的列表。然后在该列表之后不久,他们提到以下内容:



注意最后一句话:“Pthread互斥锁和条件变量同步调用已超出限制”

可以从信号处理程序调用的上述函数描述如下:



pthread同步函数没有称为重入的特殊属性,因此我想像一下,如果这些函数(例如pthread_mutex_lock())被到达的信号中断,则该行为不是“安全的”。

想象一下,您的应用程序调用了pthread_mutex_lock(&theMutex),并且恰好在那一刻(即在pthread_mutex_lock()函数中)到达了一个信号。如果信号处理程序还调用pthread_mutex_lock(&theMutex),则先前的pthread调用可能尚未终止,因此无法保证对pthread_mutex_lock()的调用将获得锁定。因此,所产生的行为将是不确定的/不确定的。

我可以想象,从特定线程对sigwait()的调用将保证不会中断重要的non-reentrancy函数调用,从而使对pthread同步函数的调用“安全”。

关于multithreading - 从信号处理程序访问共享数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12445618/

10-11 04:04
查看更多