C# で、 2つのスレッドから 1つのメソッドを同時に呼び出したい


C# を使っています。

二つのスレッドから一つの計算メソッドを同時に使用したいのですが、

_（スレッドA → 計算メソッド ← スレッドB）_

とする場合はやはり以下のように、計算メソッドを２つ作るしかないのでしょうか？

_（スレッドA → 計算メソッドA / スレッドB → 計算メソッドB）_




メソッドを2つ作る必要はありません。  
ただしスレッド間で値が競合し得るならば lock により排他制御すべきです(※calc1)。  
※ロックすべきかどうかは計算に使う値がスレッド間で競合するかどうかによります。

[code]

    using System;
    using System.Collections.Generic;
    using System.Threading;
    
    class Program
    {
        static List<int> list = new List<int>();
    
        public static int calc1()
        {
            int xxx = 0;
            lock(list)
            {
                // list を使った計算
            }
            return xxx;
        }
    
        public static int calc2(List<int> 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<int> list = new List<int>();
                Console.WriteLine(calc2(list));
            });
            t2 = new Thread(() => {
                List<int> list = new List<int>();
                Console.WriteLine(calc2(list));
            });
            t1.Start();
            t2.Start();
            t1.Join();
            t2.Join();
        }
    
    }
    
[/code]

スレッド間で競合しないのであれば lock の必要はありません(※calc2)。  
なお、上記の list が参照しか行われないのであれば calc1 でも排他の必要はありません。




メソッドを2つ作る必要はありません。  
ただしスレッド間で値が競合し得るならば lock により排他制御すべきです(※calc1)。  
※ロックすべきかどうかは計算に使う値がスレッド間で競合するかどうかによります。

[code]

    using System;
    using System.Collections.Generic;
    using System.Threading;
    
    class Program
    {
        static List<int> list = new List<int>();
    
        public static int calc1()
        {
            int xxx = 0;
            lock(list)
            {
                // list を使った計算
            }
            return xxx;
        }
    
        public static int calc2(List<int> 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<int> list = new List<int>();
                Console.WriteLine(calc2(list));
            });
            t2 = new Thread(() => {
                List<int> list = new List<int>();
                Console.WriteLine(calc2(list));
            });
            t1.Start();
            t2.Start();
            t1.Join();
            t2.Join();
        }
    
    }
    
[/code]

スレッド間で競合しないのであれば lock の必要はありません(※calc2)。  
なお、上記の list が参照しか行われないのであれば calc1 でも排他の必要はありません。

