Java: загрузка одной динамической библиотеки в два потока (оба потока в одной и той же JVM) - PullRequest
4 голосов
/ 11 января 2010

Я использую библиотеку (написанную на C), которая не реентерабельна (т.е. ни одна функция в библиотеке не реентерабельна). Предположим, я загрузил библиотеку через System.load, чтобы получить дескриптор «v». Я не могу использовать v в двух потоках из-за проблем повторного входа (пробовал, но бессмысленные результаты). Я мог бы использовать блокировки, но это побеждает любой параллелизм, который я мог бы получить.

Я хотел бы запустить два потока и в каждом потоке загрузить библиотеку, чтобы получить два разных дескриптора (таким образом, есть две копии загруженной библиотеки).

Возможно ли это на Java? С уважением Saptarshi

Ответы [ 3 ]

2 голосов
/ 11 января 2010

Это невозможно. Это было бы эквивалентно использованию POSIX dlopen и т. Д. Для динамической загрузки нескольких копий библиотеки C / C ++ в программу C / C ++, и это тоже не работает.

Ваши основные параметры:

  • изменить библиотеку C, чтобы сделать ее поточно-ориентированной

  • перекодировать его (поточно-ориентированный) Java

  • обернуть его как приложение и запустить несколько копий как отдельные процессы

  • оберните его как службу и запустите несколько копий, общаясь с ним с помощью сокетов или соответствующего высокоуровневого механизма RPC.

2 голосов
/ 11 января 2010

Любая DLL может быть загружена только один раз процессом, поэтому я не думаю, что вы можете достичь того, чего хотите.Вы могли бы обмануть и переименовать DLL на другое имя, может быть?

Ваши потоки проводят в DLL столько времени, что нет другого параллелизма?

1 голос
/ 11 января 2010

Это не представляется возможным. Метод System.loadLibrary не имеет никаких аргументов или документации, которые бы указывали на то, что вы можете загружать библиотеку специфичным для потока способом или загружать одну и ту же библиотеку дважды.

Если бы у вас было определенное количество потоков, вы могли бы создать несколько библиотек с немного разными схемами именования. В противном случае вам, вероятно, следует просто реализовать блокировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...