1

我正在编写一个 Java 程序,它使用用 c 编写的硬件驱动程序。此硬件驱动程序启动一个回调线程,您可以注册回调函数以在发生事情时调用。如何将此线程附加到 jvm,以便它可以为这些回调调用 Java 方法?我只有从 start_callbacks() 函数返回的线程 ID,以 int 形式返回,但它是调用 pthread_create() 时使用的 pthread_t。

我发现的一种方法是在每个回调函数的开头使用 pthread_once 并将线程附加到那里。但是没有办法将其分离。我尝试使用 pthread_cleanup_push/pop,但它们需要成对调用,这样就不起作用了。

在我看来,我唯一能做到这一点的选择是在每次回调调用时附加和分离线程。或者稍微重写驱动程序,我真的不想这样做。

有什么我错过的吗?

4

2 回答 2

2

这正是 JNI 的要求AttachCurrentThread()DetachCurrentThread()目的。

于 2012-04-06T06:45:18.253 回答
0

可以使用 thread_local 存储(C++ 11 及更高版本)解决您的问题。这允许您附加到任意线程,然后当线程存在时它会自动分离(即使您没有创建线程并且无法控制它的生命周期)。

如何在 C++ 中实现它的示例可以在我的回答中找到: https ://stackoverflow.com/a/59934966/8367574

于 2020-01-27T16:25:17.697 回答