6

我想知道从信号处理程序访问共享数据是否是个好主意。我的意思是考虑具有单个进程的多进程系统和多线程系统的场景。在多进程系统中,假设我让进程处理特定信号并通过进程更新某些共享变量或内存。我可以从信号处理程序本身做到这一点吗?

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

我有点困惑,在多进程系统中,每个进程都有一个信号处理程序的副本。但是在多线程系统中,多个线程使用的信号处理程序只有一个副本,不是吗。那么当多个相同类型的信号到达并且我们有两个负责处理它的线程尝试处理它时,它们都会尝试执行同一段处理程序代码吗?这一切如何适应?

4

1 回答 1

6

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

但是 Pthreads 调用在哪里呢?他们不在这两个列表中!事实上,Pthreads 标准规定,当从信号处理程序调用函数时,所有 Pthreads 函数的行为都是未定义的。如果您的处理程序需要处理与其他线程共享的数据≈缓冲区、标志或状态变量≈它是不走运的。Pthreads 互斥锁和条件变量同步调用不受限制。

注意最后一句话:“Pthreads 互斥和条件变量同步调用是禁止的”

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

这些函数具有称为可重入性的特殊属性,它允许进程同时对这些函数进行多次调用。

pthread 同步函数没有称为可重入的特殊属性,所以我想如果这些函数(例如 pthread_mutex_lock() )被到达的信号中断,那么行为不是“安全的”。

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

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

于 2012-09-16T15:19:35.023 回答