2010-01-11 3 views
4

재진입 가능하지 않은 (즉, 라이브러리의 어떤 기능도 재진입이 불가능한) 라이브러리 (C로 작성된 라이브러리)를 사용하고 있습니다. 'v'핸들을 얻기 위해 System.load를 통해 라이브러리를로드했다고 가정합니다. 재진입 문제 (시도했지만 말도 안되는 결과) 때문에 두 개의 스레드에서 v를 사용할 수 없습니다. 나는 자물쇠를 사용할 수 있었지만, 내가 가질 수 있었던 어떤 평행선이라도 패배시켰다.Java : 동일한 동적 라이브러리를 두 개의 스레드 (동일한 JVM의 두 스레드)에로드하십시오.

내가하고 싶은 것은 두 개의 스레드를 시작하고 두 개의 다른 핸들을 얻기 위해 각 스레드의 스레드를로드하는 것입니다 (따라서로드 된 라이브러리의 사본이 두 개 있습니다).

Java로 가능합니까? 감사합니다 Saptarshi

답변

2

모든 DLL은 프로세스에 의해 한 번만로드 될 수 있으므로 원하는 것을 얻을 수 있다고 생각하지 않습니다. 속임수를 사용하고 DLL 이름을 다른 이름으로 바꿀 수 있습니까?

스레드가 DLL에 너무 많은 시간을 할애하여 다른 병렬 처리가 없다고 생각합니까?

+0

로드하는 라이브러리는 eval 및 parse라는 함수입니다. 나는 문장을 분석하고 평가하고있다 (평가는 많은 시간이 걸릴 수있다). 이러한 함수 중 어느 것도 스레드로부터 안전하지는 않지만 라이브러리의 메모리 할당자는 스레드로부터 안전하지 않습니다. 나는 병렬 eval을하고 싶다. 그렇다. 쓰레드의 대부분은 라이브러리의 'parse'& 'eval'함수를 호출하는 것이다. – Sapsi

1

이것은 가능하지 않습니다. System.loadLibrary 메서드에는 스레드 관련 방식으로 라이브러리를로드하거나 동일한 라이브러리를 두 번로드 할 수 있음을 나타내는 인수 또는 설명서가 없습니다.

특정 스레드 수가있는 경우 이름 지정 스키마가 약간 다른 여러 라이브러리를 만들 수 있습니다. 그렇지 않으면 잠금을 구현해야합니다.

2

불가능합니다. 이것은 POSIX dlopen 등을 사용하여 C/C++ 라이브러리의 여러 복사본을 C/C++ 프로그램에 동적으로로드하는 것과 동일하며 작동하지 않습니다.

기본 옵션은 다음과 같습니다

  • 이 (thread 세이프 인) 자바

  • 에서이 스레드 안전

  • 레코딩을 할 응용 프로그램으로 그것을 포장하는 C 라이브러리를 수정 여러 복사본을 별도의 프로세스로 실행하십시오.

  • 서비스로 포장하고 여러 복사본을 실행하여 소켓 또는 적절한 고급 RPC 메커니즘.

관련 문제