Будут ли потоки JVM всегда поддерживать соответствие с потоками ОС - PullRequest
3 голосов
/ 29 июня 2019

Я пишу сервис, который использует JNA для делегирования работы с Java в собственную библиотеку C ++. Библиотека C ++ выполняет асинхронный вызов для вычислительно дорогой задачи, а затем получает обратный вызов (в другом потоке ОС), когда эта задача завершена. Я хотел бы перенаправить результат этой работы обратно в правильный поток в JVM.

Что мне интересно, так это то, могу ли я гарантировать, что у идентификатора потока JVM всегда будет однозначное соответствие с собственным thread_id? То есть если я записываю идентификатор потока в C ++ через

std::this_thread::get_id()

затем начните дорогую работу и заблокируйте на cv, что поток все еще будет там, когда работа будет завершена, и что я смогу правильно возвращать результаты в JVM. Будут ли какие-то закулисные JVM, такие как JIT, GC, или остановить мировые коллекции, поводом для беспокойства по поводу этого паттерна?

Ответы [ 2 ]

5 голосов
/ 30 июня 2019

Ответ не указан в JLS, спецификации JVM или Javadocs.

Действительно, возможно, это зависит от платформы. Например, в JVM для Solaris (или было возможно) сделать N: M-сопоставление потоков пользовательского пространства с потоками пространства ядра; см. этот документ . Не ясно, что это означает / означает для собственного идентификатора потока.

Так будет ли родная нить thread_id постоянной для JVM, которую вы используете?

Есть только один способ убедиться: скачать исходный код JVM и проверить.

Предупреждение : это страшно сложно!

(И вам, вероятно, следует принять это как намек на то, что вы не должны делать подобные вещи ... если вам придется обратиться к StackOverflow, если он будет работать!)

0 голосов
/ 30 июня 2019

Мне кажется, что это плохой дизайн, который требует, чтобы вы знали, как работает JVM.

Если вы все-таки перенаправили некоторые данные Java на уровень C ++, почему бы не маршалировать callback + context?когда поток C ++ заканчивает обработку данных, он вызывает обратный вызов Java с предоставленным контекстом и на уровне Java - вы возвращаете результат обратно в поток Java.

уровень C ++ не должен ничего знать о том, какПотоки Java работают - все, что нужно сделать, это вызвать обратный вызов и позволить обратному вызову разобраться с деталями реализации.

Я действительно делал это несколько раз в прошлом, но в C # и P / Invoke,который легко позволяет вам маршалировать функцию C # как указатель на C-функцию.Я уверен, что это возможно и для JNI.

...