-2

スレッドに問題があります。コードは次のとおりです。

class myThread
{
    public int _start, _finish;
    string[] new_array = new string[10];
    public static string[] existed_array = new string[20];    
    public myThread(string name, int start, int finish)
    {
        _start = start;
        _finish = finish;
        Thread thread = new Thread(this.Get);
        thread.Name = name;
        thread.Start();//передача параметра в поток
     }

    void Get()
    {
        for (int ii = _start; ii < _finish; ii++)
        {
           // i put data in existed array in Main()
           // new array is just an array where i want to put existed data
           new_array[ii] = existed_array[ii];
           // but in output new_array[0]=null; new_array[1]=value
        }
    }
}

void Main ()
{
    // For example
    myThread.existed_array = {1, 2 , 3, ...}

    myThread t1 = new myThread("Thread 1", 0, 1);
    myThread t2 = new myThread("Thread 2", 1, 2);
}

スレッドは異なるパラメーターを使用してGet()を実行しますが、出力には2番目のスレッドのパラメーターのみが含まれます。ステップバイステップのプログラムからわかるように、Get関数のすべての行が2回実行されるので、これがポイントです。どうすればこの問題を解決できますか?

4

1 に答える 1

1

これを正しく理解していれば、コードは想定どおりに実行されます。

あなたのコメントでは、「しかし、出力では new_array[0]=null; new_array[0]=value」と主張しています。これについての私の解釈は、あなたの 2 番目のスレッドではnew_array[0] = null、そして最初のスレッドではnew_array[0] = <some value>です。

コードによるnew_arrayと、非静的変数です。つまり、スレッド間で共有されません。

2 番目のスレッドに指定したパラメーターを考慮すると、配列の 0 番目に触れることはありません。開始値を 1 に設定したため、1 からii開始します。つまりnew_array[0]、何も設定しないため、デフォルトでnull.

于 2012-09-09T07:59:49.747 に答える