好的,所以如果我在linux上的子线程中运行(如果重要的话使用pthreads),并运行以下命令
kill(getpid(), someSignal);
它会将给定的信号发送给当前线程的父节点。
我的问题:在kill()
之后的语句之前,是否保证父母会立即获得CPU并处理信号(如果是SIGKILL则杀死应用程序,或者如果是其他信号则执行其他任何操作)跑?或者是否可能 - 甚至可能 - 在父线程处理信号之前,kill()
之后的任何命令都会运行?
答案 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()返回之前传递给发送线程。