2017-10-11 23 views
0

JDKを使用してC++ライブラリに実装されたgetServer()メソッド。入力パラメータを受け取り、サーバに接続してサーバオブジェクトを返します。私は、さまざまなJavaスレッドを使用してネイティブメソッドの上に呼び出しています。そして、このネイティブメソッドは、ネイティブメソッドが実装されているいくつかのグローバル変数を使用します。複数のJavaスレッドによるJavaネイティブアクセスを使用する複数のメソッド呼び出し

Native.hファイルでネイティブメソッドをextern "C"として宣言し、ネイティブメソッドをNative.cppファイルに実装しました。このメソッドはスタンドアロンメソッドです。つまり、クラスや構造の一部ではありません。

Native.cppにいくつかのグローバル変数がある場合、その値は同じネイティブメソッドを呼び出す異なるJavaスレッドから変更されていますか?

+0

メソッドがグローバル変数に対してgettersおよびsettersメソッドを実行している場合は、値が変更されます。 – Lokesh

+0

これは、[JNA経由でネイティブライブラリを呼び出す際の同時実行性の問題](https://stackoverflow.com/questions/6983007/concurrency-issue-while-calling-a-native-library-html-html)と重複しています。 via-jna)、間接的に質問に答えて回避策を提供します。これがあなたの質問に答えることに同意しましたか? –

+0

@ErwinBolwidt: - Javaからネイティブへの呼び出しを同期する方法について説明した上記のリンク。しかし、私の場合、ネイティブファイルに存在するグローバル変数について知りたい。 – Prashant

答えて

0

同じネイティブメソッドを呼び出す異なるJavaスレッドから値が変更されていますか?

確かに、グローバル変数が、のことの証明に非常に簡単な例を書いてみましょうだけでなく、スレッドによって、すべての仮想マシンで共有されます。

counter.cで

#include<stdio.h> 

int counter = 0; 
int incrementAndGet(){ 
    counter++; 
    return counter; 
} 

がそれを呼び出しますJNA

final ExecutorService executorService = Executors.newFixedThreadPool(5); 
for (int i = 0; i < 20; i++) { 
    executorService.submit(() -> { 
     try { 
      TimeUnit.MILLISECONDS.sleep((long) (Math.random() * 1000)); 
     } catch (InterruptedException e) {} 
     System.out.printf("thread=%s, counter=%d%n", Thread.currentThread().getName(), CounterLib.INSTANCE.incrementAndGet()); 
    }); 
} 
executorService.awaitTermination(10, TimeUnit.SECONDS); 
executorService.shutdown(); 

出力

を使用してJavaで
thread=pool-1-thread-2, counter=1 
thread=pool-1-thread-4, counter=2 
thread=pool-1-thread-1, counter=3 
thread=pool-1-thread-5, counter=4 
thread=pool-1-thread-2, counter=5 
thread=pool-1-thread-3, counter=6 
thread=pool-1-thread-2, counter=7 
thread=pool-1-thread-4, counter=8 
thread=pool-1-thread-1, counter=9 
thread=pool-1-thread-2, counter=10 
thread=pool-1-thread-5, counter=11 
thread=pool-1-thread-3, counter=12 
thread=pool-1-thread-5, counter=13 
.... 

このグローバル変数の並行性やjavaやcの2つが不要な場合は、グローバル変数から値を読み取るだけであれば、並行性について心配する必要はありません。