2

わかった。2つのスレッドを実行したい。現在のコード:

    public void foo()
    {      
            lock(this)
            {
                while (stopThreads == false)
                {
                   foreach (var acc in myList)
                   {
                     // process some stuff
                   }
                 }
             }
     }

    public void bar()
    {      
            lock(this)
            {
                while (stopThreads == false)
                {
                   foreach (var acc in myList)
                   {
                     // process some stuff
                   }
                 }
             }
     }

両方が同じリストにアクセスしています。問題は、最初のスレッド「foo」がロックを解放していないことです。「bar」は「foo」が実行されたときにのみ開始されるためです。ありがとう

4

3 に答える 3

3

はい、それがロックが機能するように設計されている方法です。

lockキーワードは、特定のオブジェクトの相互排他ロックを取得し、ステートメントを実行してからロックを解放することにより、ステートメントブロックをクリティカルセクションとしてマークします。

相互排除とは、いつでもロックを保持できるスレッドが最大で1つであることを意味します。

これをロックすることは悪い考えであり、お勧めできません。代わりに、プライベートオブジェクトを作成し、それをロックする必要があります。問題を解決するために、2つの異なるオブジェクトをロックすることができます。

private object lockObject1 = new object();
private object lockObject2 = new object();

public void foo()
{      
    lock (lockObject1)
    {
         // ...
    }
}

public void bar()
{      
    lock (lockObject2)
    {
         // ...
    }
}

または、同じロックを再利用してループ内に移動し、各ループが続行できるようにすることもできます。

while (stopThreads == false)
{
   foreach (var acc in myList)
   {
       lock (lockObject)
       {
           // process some stuff
       }
   }
}

ただし、マシンで機能するように見えるまでコードの行を並べ替えるのではなく、何が起こっているのかを理解するために時間をかけることをお勧めします。正しいマルチスレッドコードを書くことは困難です。

スレッドを停止するには、この記事をお勧めします:

于 2010-09-25T11:09:19.190 に答える
1
于 2010-09-25T11:34:36.333 に答える
0

あなたが持っている問題は、あなたが非常に粗いロックで作業しているということです。FooとBadは基本的に同時に機能しません。これは、最初に開始した人がCOMPLETEWORKCYCLEでもう一方を停止するためです。

ただし、リストから物を取り出している間だけロックする必要があります。Foreachはここでは機能しません-定義によると。2番目のリストを作成し、各スレッドに(ロックイン中に)トップアイテムを削除させてから、それに取り組む必要があります。

基本的に:

  • 両方のスレッドが強制リストを実行するため、Foreachは機能しません
  • 第二に、ロックは必要なときにだけロックするという点できめ細かくする必要があります。

あなたの場合、fooをロックインすると、fooが終了したときにのみ解放されます。

于 2010-09-25T11:22:51.827 に答える