是否使用kill发送到父线程的信号保证在下一个语句之前处理?

时间:2010-04-24 02:07:16

标签: c++ c linux multithreading pthreads

好的,所以如果我在linux上的子线程中运行(如果重要的话使用pthreads),并运行以下命令

kill(getpid(), someSignal);

它会将给定的信号发送给当前线程的父节点。

我的问题:在kill()之后的语句之前,是否保证父母会立即获得CPU并处理信号(如果是SIGKILL则杀死应用程序,或者如果是其他信号则执行其他任何操作)跑?或者是否可能 - 甚至可能 - 在父线程处理信号之前,kill()之后的任何命令都会运行?

3 个答案:

答案 0 :(得分:5)

不,这不能保证。

通常,除非使用显式同步机制(例如,phtread_mutex或信号量),否则不能对单独的线程(或进程)中发生的事件的时间进行任何假设。

在多CPU(或多核)系统中尤其如此,其中多个线程可以在单独的CPU上同时运行,但即使在单CPU系统上也无法保证。

答案 1 :(得分:3)

信号以异步方式传递,因此您不能指望处理它们的线程立即处理它们;而且,它必须做一些工作来处理它。

如果sigprocmask()调用屏蔽了所有线程中的信号,则只有在取消屏蔽后才会对该信号起作用。

信号不会转到任何特定线程,除非您使用sigprocmask将它们从您不想获取它们的线程中屏蔽掉。大多数多线程程序都是这样做的,因为传递给任意线程的进程级信号通常不是你想要的。

答案 2 :(得分:1)

发送到进程(线程组)的信号通常可以传递到任何线程,并且通常无法保证在kill调用返回之前处理程序已完成。

如果你跑

kill(getpid(), someSignal);

在多线程进程中,您只能确保在非常特定的情况下,kill返回之前您的sighandler将运行 除了调用线程之外的所有线程都被someSignal阻塞(在这种情况下,sig处理程序将从调用kill的线程运行。)

请参阅 http://pubs.opengroup.org/onlinepubs/009695399/functions/kill.html

  

如果pid的值导致为发送生成sig   进程,如果没有为调用线程阻止sig,如果没有   其他线程已取消阻止或正在sigwait()函数中等待   对于sig,要么是sig,要么是至少一个待处理的未阻塞信号   在kill()返回之前传递给发送线程。