1

私は控えめに言ってもアマチュアですが、いくつかの基本的なプログラムを作成しました。とにかく、DVD交換ロボットを作っています。ハードウェア側はすでに構築されており、シリアルポートを介してうまく機能します。これを機能させるには、最初にマルチスレッドアプリを作成する必要があります。

アプリには少なくとも4つのスレッドが必要です。2台のDVDレコーダー用に2台、1台はロボット制御用、もう1台は他の3つのスレッドに何をすべきかを指示するディレクターを呼んでいます。

私の問題は、これらのスレッド間でデータを共有するための最良の方法は何かということです。共有クラスやスレッドロックを少し見て回っていますが、複雑になりすぎているような気がします。データベースを使用してデータを渡し、各スレッドに数秒ごとにデータベースをチェックさせることができることは知っていますが、それは私にはこれを行う正しい方法のようには感じられません。

アドバイスありがとうございます。

4

1 に答える 1

3

メソッドに必要なデータを渡すことができますThread.Start()。これは基本的に、スレッド間でコンテンツを共有するための推奨される方法です。ただし、基本的なレベルでは、複数のスレッドが他のスレッドもアクセスするものにアクセスする場合は、競合の問題が発生しないように、何らかのロックメカニズムを確立する必要があります。

スレッド間で共有されるグローバルレベルのクラスインスタンスがあるとします。

(これはC#ですが、アイデアは得られます)

class GlobalData {

    public string SomeProperty {get; set; }
    public int SomeOtherProperty {get; set; }

}

複数のスレッドがこれらのプロパティのいずれかに同時にアクセスする(または値が呼び出し間で一貫していると期待する)シナリオは問題になります。したがって、最も簡単な方法は、スレッドが責任を負うロックメカニズムを作成することです。

class GlobalData {

    public object Sentry = new object();

    public string SomeProperty {get; set; }
    public int SomeOtherProperty {get; set; }
}

スレッドを実行するコードでは、次のようにします(g_Dataクラスのインスタンスであると想定)。

void SomeMethodRunningOnAThread() {
    lock (g_Data.Sentry) {
        // do stuff    
    }
}

(VB.NETではと同等lockですSyncLock

これは、競合の問題が発生しないようにするための最も簡単な方法です。各スレッドは、そのコンテンツにアクセスする前に、オブジェクトのロックを試行していることを確認する責任があります。

それ以外にも、グローバルデータを含むクラス内にロックロジックを実装するなど、これを洗練する方法はもちろんあります。それほど複雑になることはないので、最終的にもっと複雑なものを実装したい場合は、とにかく読む必要があります。

于 2012-05-18T01:10:26.377 に答える