无法在消费者线程中使用 JNI 的生产者-消费者程序中捕获 SIGINT 信号

Posted

技术标签:

【中文标题】无法在消费者线程中使用 JNI 的生产者-消费者程序中捕获 SIGINT 信号【英文标题】:Cannot catch SIGINT signal in a producer-consumer program where JNI is used in consumer thread 【发布时间】:2015-10-29 15:57:17 【问题描述】:

我正在为生产者-消费者问题编写程序。

生产者生产数据并将数据推送到boost::spsc_queue,消费者对其进行处理。

在消费者线程中,我使用JNI 从我用 c++ 编写的代码中调用一些 java 函数。

我是 initializing and creating JVM 在消费者线程调用的函数中,然后事件循环开始,它从 boost::spsc_queue 弹出数据并处理它。

现在,我想捕捉SIGINT 信号,所以我写了一个signal_handler 并将它注册到我的main() 函数中。但它不起作用。

如果我注释掉所有 JNI 内容并在消费者线程调用的函数中启动循环 while(1),那么它正在捕获 SIGINT 并按预期工作。

我还需要处理 JVM 或 JNI 的东西吗? 在主线程中初始化和创建 JVM 后,我应该尝试同样的事情吗?有意义吗?

【问题讨论】:

【参考方案1】:

看来,你需要-Xrs option

-Xrs

减少 JVM 对操作系统信号的使用。

嵌入 JVM 的应用程序经常需要捕获 SIGINTSIGTERM 等信号,这可能会导致干扰 JVM 信号处理程序。 -Xrs 选项可用于解决此问题。使用-Xrs 时,JVM 不会更改SIGINTSIGTERMSIGHUPSIGQUIT 的信号掩码,并且不会安装这些信号的信号处理程序。

指定-Xrs有两种后果:

SIGQUIT 线程转储不可用。

用户代码负责导致关闭挂钩运行,例如,当 JVM 被终止时调用System.exit()

您可以在传递给JNI_CreateJavaVM(…)JavaVMInitArgs 中指定此类选项。

【讨论】:

【参考方案2】:

是的,JVM 出于自己的目的使用信号处理程序,这就是为什么您需要特别关注信号链的原因。 Read more >

【讨论】:

以上是关于无法在消费者线程中使用 JNI 的生产者-消费者程序中捕获 SIGINT 信号的主要内容,如果未能解决你的问题,请参考以下文章

Python协程实现生产者消费者模型

第四十一天:协程操作

python基础:协程详解

Python协程理解——基于爬虫举例

进程_线程 之 --- 生产者消费者

线程通信