質問: C# を使っています。 二つのスレッドから一つの計算メソッドを同時に使用したいのですが、 *(スレッドA → 計算メソッド ← スレッドB)* とする場合はやはり以下のように、計算メソッドを2つ作るしかないのでしょうか? *(スレッドA → 計算メソッドA / スレッドB → 計算メソッドB)*
回答: メソッドを2つ作る必要はありません。 ただしスレッド間で値が競合し得るならば lock により排他制御すべきです(※calc1)。 ※ロックすべきかどうかは計算に使う値がスレッド間で競合するかどうかによります。 ``` using System; using System.Collections.Generic; using System.Threading; class Program { static List list = new List(); public static int calc1() { int xxx = 0; lock(list) { // list を使った計算 } return xxx; } public static int calc2(List args) { int xxx = 0; // args を使った計算 return xxx; } static void Main(string[] args) { // list が競合するので lock する必要がある Thread t1 = new Thread(() => { Console.WriteLine(calc1()); }); Thread t2 = new Thread(() => { Console.WriteLine(calc1()); }); t1.Start(); t2.Start(); t1.Join(); t2.Join(); // 引数が競合しないので lock の必要はない t1 = new Thread(() => { List list = new List(); Console.WriteLine(calc2(list)); }); t2 = new Thread(() => { List list = new List(); Console.WriteLine(calc2(list)); }); t1.Start(); t2.Start(); t1.Join(); t2.Join(); } } ``` スレッド間で競合しないのであれば lock の必要はありません(※calc2)。 なお、上記の list が参照しか行われないのであれば calc1 でも排他の必要はありません。