メソッドに必要なデータを渡すことができます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
)
これは、競合の問題が発生しないようにするための最も簡単な方法です。各スレッドは、そのコンテンツにアクセスする前に、オブジェクトのロックを試行していることを確認する責任があります。
それ以外にも、グローバルデータを含むクラス内にロックロジックを実装するなど、これを洗練する方法はもちろんあります。それほど複雑になることはないので、最終的にもっと複雑なものを実装したい場合は、とにかく読む必要があります。