JNI 线程模型
JNI thread model?
当我从 Java 调用 C/C++ 时
,JavaVM 或 JNI 是否创建了一个新线程来在我的 Java 线程等待时运行 C/C++ 代码?我问这个是因为我的 C/C++ 代码在 GPU 上运行某些内容,我需要检查特定的缓冲区才能返回结果。获得结果后,我需要再次调用我的 Java 函数。
所以我正在考虑在C++端创建一个线程,该线程不断检查缓冲区,一旦有一些数据可用,就会回调 Java 端。
JNI 不会在后台创建任何新线程。本机函数与调用本机函数的 java 方法在同一线程中执行。反之亦然,当本机代码调用 java 方法时,java 方法与调用该方法的本机代码在同一线程中执行。
它有后果 - 当本机函数返回时,本机函数调用返回到 java 代码,当调用的 java 方法返回时,本机代码继续执行。
当本机代码执行应在单独线程中运行的处理时,必须显式创建线程。您可以创建新的 Java 线程并从此专用线程调用本机方法。或者,您可以在本机代码中创建新的本机线程,启动它并从本机函数返回。
// Call a native function in a dedicated java thread
native void cFunction();
...
new Thread() {
public void run() {
cFunction();
}
};
// Create a native thread - java part
native void cFunction()
...
cFunction();
// Create a native thread - C part
void *processing_function(void *p);
JNIEXPORT void JNICALL Java____cFunction(JNIEnv *e, jobject obj) {
pthread_t t;
pthread_create(&t, NULL, processing_function, NULL);
}
如果您使用第二个变体,并且想要从本机创建的线程调用 java 回调,则必须将该线程附加到 JVM。怎么办?请参阅 JNI 连接/分离线程内存管理...
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 如何在Qt中合并/追加/添加两个用于线程的模型?
- 在C 中,发送者接收器模型中的多线程
- 在使用Win32线程模型时,MinGW-w64是否支持开箱即用的std::线程
- 在g++中是使用pthreads作为后台的C++11线程模型
- 适用于bittorrent客户端的良好多线程模型
- 具有强内存模型的平台上的易失性和多线程
- Qt模型在单独的线程中查看数据和模型
- 为什么某些线程池实现不使用生产者和使用者模型
- 并发:用于多线程环境中共享变量的C++11内存模型
- 如何取消一个特定的线程,而使用c++ 11线程模型或tbb线程类
- Qt:如何同步访问数据从多个线程在模型/视图设置
- 如何将下面的线程模型从c++转换为go
- 非阻塞套接字多线程接收模型
- 从运行QML QtQuick2引擎的不同线程更新c++模型的行为
- 应该使用哪个线程模型来创建馈送处理程序或适配器
- JNI 线程模型
- 多线程/分叉服务器守护进程的模型