9

質問があります。メソッド DoSomething() を持つオブジェクトがある場合、このメソッドに複数のスレッドを作成すると、それは機能し、独自の別のスレッドとして実行されますか?

例えば

public class SomeClass
{
    public void DoSomething()
    {
        //somethings done here
    }
}

public class MainProgram
{
    public MainProgram()
    {
         InitializeComponents();
    }

    protected override OnStart(string[] args)
    {
         SomeClass sc = new SomeClass();
         Thread workerOne = new Thread(() => sc.DoSomething());
         workerOne.Start();

         Thread workerTwo = new Thread(() => sc.DoSomething());
         workerTwo.Start(); //start a new thread calling same method
    }
}

それが私の言いたいことを説明してくれることを願っています。これは機能しますか、それとも問題を引き起こしますか?

私はほぼリアルタイムのソフトウェアである必要があるプログラムを書いています。現在、SomeClass の新しいインスタンスを初期化する方が良いかどうかを判断していますか?

誰かが答えてくれることを願っています。私の質問が意味をなさない場合は、コメントしてください。さらに説明します!

ありがとう、

Base33

PSコードは例のために特別に書かれました:)

4

4 に答える 4

16

各スレッドには個別の呼び出しスタックがあるため、両方とも同じオブジェクトで同じメソッドを使用できます実際、必要に応じて、各スレッドは (再帰を介して) 同じインスタンスで同じメソッドを複数回呼び出すことができます。

ただし、そのオブジェクトで状態(インスタンスまたは静的フィールドなど、およびその状態に関連するもの)を使用している場合は、つまずく可能性があります。共有状態へのアクセスでは、マルチスレッド アクセスを完全に考慮する必要があります (おそらく同期化も必要です)。

于 2012-06-11T19:46:35.093 に答える
3

はい、できます。ただし、そのメソッド内のメンバー アクセスがスレッド セーフであることを確認する必要があります。

オブジェクトの状態を変更する場合は、読み取りと書き込みをロックするか (特定のメカニズムについては言及しません)、特定の時点でメソッドを中断しても問題がなく、別のスレッドでの他の呼び出しが引き続き正しく機能することを確認する必要があります。

于 2012-06-11T19:45:56.450 に答える
1

問題ありません。エラーなく実行されます。

オブジェクトを作成し、このオブジェクトのメソッドを 2 回呼び出すようなものです。唯一の事実は、同じメソッドを呼び出す 2 つのオカレンスが異なるスレッド上にあるということです。

于 2012-06-11T19:49:53.237 に答える
1

メソッド DoSomething() を持つオブジェクトがある場合、このメソッドに複数のスレッドを作成すると、それは機能し、独自の別のスレッドとして実行されますか?

はい、可能です。あなたのコード例でDoSomethingは、 の同じインスタンスで呼び出されていますSomeClass。両方のスレッドがこれを共有します。2 つの異なるスレッドがありますが、共有されている実際のオブジェクトは 1 つです。

これは機能しますか、それとも問題を引き起こしますか?

それはあなたのユースケースに完全に依存します。そうかもしれないし、そうでないかもしれない。オブジェクトが共有されている場合は、それらへのアクセスを同期する必要があります。

于 2012-06-11T19:47:12.677 に答える