Java 个 JNI C++ 环境中的线程仅使用一个内核。 ARM 处理器和 Ubuntu
Java threads in JNI C++ environment using only one core. Arm Processor and Ubuntu
我制作了多线程 java 程序来处理文件中的数据。这是经过充分测试的,并将工作负载分配到可用的 cpu 个内核上。
现在我用 C++ 做了一个原生的 reader。该程序使用 JNI 从 Java 内部启动,并在数据准备就绪时调用 java 程序。
除了在激活本机 reader 时整个 java 程序仅使用一个内核之外,该机制运行良好。
我怀疑 C++ reader 编译不正确,或者 JNI 共享内存有问题。
我已经为 C++ 程序尝试了几个编译器和链接器选项:-pthread -lpthread -std=c++11
平台为:Jetson TK1,配备Arm处理器。 Java甲骨文 1.8。 OS Ubuntu.
感谢您的回答。
已解决!
问题是在需要时从其他处理线程生成新线程。 (线程延迟启动)
当所有线程都基于 java 时从文件读取时,这非常有用。
在这种情况下,新的 java 线程是从 C++ 通过 JNI 产生的线程生成的。我不知道为什么,但在这种情况下,新线程最终 运行 在同一个核心上。
解决方案是在将处理单元添加到 java 中的框架时启动线程。
现在所有 cpu 个核心都被利用了!
再次感谢Jojje!我想你的评论已经明白了!
我制作了多线程 java 程序来处理文件中的数据。这是经过充分测试的,并将工作负载分配到可用的 cpu 个内核上。
现在我用 C++ 做了一个原生的 reader。该程序使用 JNI 从 Java 内部启动,并在数据准备就绪时调用 java 程序。
除了在激活本机 reader 时整个 java 程序仅使用一个内核之外,该机制运行良好。
我怀疑 C++ reader 编译不正确,或者 JNI 共享内存有问题。
我已经为 C++ 程序尝试了几个编译器和链接器选项:-pthread -lpthread -std=c++11
平台为:Jetson TK1,配备Arm处理器。 Java甲骨文 1.8。 OS Ubuntu.
感谢您的回答。
已解决!
问题是在需要时从其他处理线程生成新线程。 (线程延迟启动) 当所有线程都基于 java 时从文件读取时,这非常有用。
在这种情况下,新的 java 线程是从 C++ 通过 JNI 产生的线程生成的。我不知道为什么,但在这种情况下,新线程最终 运行 在同一个核心上。
解决方案是在将处理单元添加到 java 中的框架时启动线程。 现在所有 cpu 个核心都被利用了!
再次感谢Jojje!我想你的评论已经明白了!