Mono UnixSignal.WaitAny永远封锁

时间:2017-03-14 14:42:19

标签: linux multithreading mono

我有一个在64位(x64)Linux平台上以单声道4.6.2运行的C#程序。我有一段简单的代码在一个单独的线程中运行:

PromptBehavior.Auto

当程序空闲时,代码工作正常,但是当程序的其他部分甚至被适度加载时,WaitAny()调用将永远阻塞,DoSomeWork()永远不会被调用。

我使用strace实用程序来查看正在发生的事情,并隔离了信号处理线程的输出,我一遍又一遍地看到这一行:

UnixSignal[] fSignals =
{
    new UnixSignal(Signum.SIGINT),
    new UnixSignal(Signum.SIGTERM)
};

while(!done)
{
   //wait 100ms for any signal
   //The mono WaitAny implementation on UnixSignal returns the timeout you requested
   // instead of WaitTimeout as the rest of the known universe does:
   // http://50.198.40.26/1.1/handlers/monodoc.ashx?link=M%3aMono.Unix.UnixSignal.WaitAny(Mono.Unix.UnixSignal%5b%5d%2cSystem.Int32)
   int index = UnixSignal.WaitAny(fSignals, 100);

   DoSomeWork();

   if (index == 100)
       continue; //no signal

   Signum signal = fSignals[index].Signum;

   //process signal
}

最后一个参数是我们指定的100ms超时。由于我没有看到任何其他值,我认为发生的是当轮询被信号中断时,例如Mono广泛使用的SIGPWR,轮询以相同的超时重新启动,直到它一次又一次地被中断。如果它经常中断,则用户进程将被阻止超过100毫秒。

这是Mono中的错误还是还有其他事情发生?

谢谢。

0 个答案:

没有答案