2016-12-23 4 views
0

私は、クラスライブラリアプリケーション呼び出しAPIを持っています。内部にはSynchronizeMeというメソッドがあります。異なるアプリケーションから呼び出されたときのメソッドの同期の問題

public class APIClass 
    { 
     object baton = new object(); 
     static int count = 0; 
     public void SynchronizeMe() 
     { 
      while(true) 
      { 
       lock (baton) 
       { 
        int temp = count; 
        Thread.Sleep(5000); 
        count = temp + 1; 

        Console.WriteLine("Thread Id " + Thread.CurrentThread.ManagedThreadId + " Name:" + Thread.CurrentThread.Name + " incremented count to " + count); 
       } 
       Thread.Sleep(1000); 
      } 

     } 
    } 

私は2つのコンソールアプリケーションスレッド1とスレッド2を持っています。どちらもSynchronizeMeメソッドを呼び出します。 ​​

のように私はこれを実行すると、私はそれらの両方は、それがsyncronizedされていないことを意味1からカウント開始を印刷ご覧ください。私は何か間違ったマルチスレッドの概念を理解していますか?コードに問題がありますか?または、同じアプリケーション内のスレッドは、同期のみが可能です。この方法で同期したいのであれば、どうしたらいいですか?

私は、スレッド1とスレッド2の両方でAPIClassのインスタンスが異なると思うので、同期ができません。何らかの方法がありますか?

+0

明確にするために、ライブラリを呼び出す2つの独立して動作するコンソールアプリケーション、または1つのコンソールアプリケーションの2つのスレッドがありますか? – user783836

+0

@ user783836 2つの別々のコンソールアプリケーションが実行されています。 – TBAG

+0

@TBAG私の答えを参照してください – user783836

答えて

2

2つのコンソールアプリケーションがある場合、lockキーワードを使用するロックは共有されません。lockは個々のプロセスに対してローカルです。

プロセス間でロックする場合は、代わりにnamed mutexを使用する必要があります。

http://www.c-sharpcorner.com/UploadFile/1d42da/threading-with-mutex/を参照してください。

ミューテックスをロックし、クロスプロセスは、以下を参照してくださいhttp://mikeperetz.blogspot.co.uk/2013/12/cross-process-locking-using-named-mutex.html

のようなものになりますあなたのコード:2つの完全に独立したコピーのをロードします

public class APIClass 
{ 
    private const string MutexName = "FAA9569-7DFE-4D6D-874D-19123FB16CBC-8739827-[SystemSpecicString]"; 
    private Mutex _globalMutex; 
    private bool _owned = false; 
    private int timeToWait = 1000; 

    object baton = new object(); 
    static int count = 0; 
    public void SynchronizeMe() 
    { 
     _globalMutex = new Mutex(true, MutexName, out _owned); 
     while(true) 
     { 
      while (!_owned) 
      { 
       // did not get the mutex, wait for it. 
       _owned = _globalMutex.WaitOne(timeToWait); 
      } 

      int temp = count; 
      Thread.Sleep(5000); 
      count = temp + 1; 

      Console.WriteLine("Thread Id " + Thread.CurrentThread.ManagedThreadId + " Name:" + Thread.CurrentThread.Name + " incremented count to " + count); 
      // release the mutex 
      _globalMutex.ReleaseMutex(); 
      Thread.Sleep(1000); 
     } 

    } 
} 
+0

同期は動作しますが、それでもプロセス間で同じカウンタ変数を使用しません。 – nvoigt

+0

@nofigt公平な点とそれが目標であるかどうか、あるいはそれが単にプロセス間同期を理解していたのであれば、それは明らかではない – user783836

+0

@ user783836第2スレッドはロックを獲得できません。 thread1のみが値を初期化しています。第2のコンソールは何も得ない。 – TBAG

0

2つのプロセス(というか2アプリのドメイン)あなたの図書館。

lockは呼び出し側アセンブリのコピーをロックするだけでなく、count変数も2つの別々のコピーとして存在します。

たとえば、mutexなどのプロセスに依存しない同期を設定できますが、そのカウンタを共有する方法を見つける必要があります。これは、ファイルやレジストリエントリに保存するだけで簡単です。データベースを使用することもできます。しかし、それを記憶しておきたい場合は、各ライブラリのコピーを既存のプロセスにロードする代わりに、3番目のプロセスを開始する必要があります。つまり、inter process communicationが必要です。

関連する問題