0

同じスレッドセーフ関数でマルチスレッドが動作しています。X 回の反復後、firstThread() に到達した最初のスレッドは firstThread() を実行し、スレッドが firstThread() で終了するまで他のスレッドが続行しないようにします。firstThread() に到達した最初のスレッドのみが実行され、他のスレッドは実行されません。レースのようなもので、最初にゴールした人が勝者です。firstThread() が完了すると、再び制限に達するまですべてのスレッドが続行されます。これを達成するための最良の方法のアイデアはありますか?

    private void ThreadBrain()
    {
        Thread[] tList = new Thread[ThreadCount];
        sw.Start();

        for (int i = 0; i < tList.Length; i++)
        {
            tList[i] = new Thread(ThProc);
            tList[i].Start();
        }

        foreach (Thread t in tList)
            if (t != null) t.Join();





    }
    private void ThProc()
    {

            doWork();



    }
   private void firstThread()
   {
    //do some work
  loopCount=0;
  }

    private void doWork()
    {
//do some work
    loopCount++;
     //first thread to reach this point calls firstThread() and prevent other threads from continuing until current thread completes firstThread()
     If(loopCount>=loopLimit)firstThread()
}
4

2 に答える 2

1

これでできます。入る最初のスレッドだけがOnlyFirst0 から 1 に変わり、 から 0 を受け取りますInterlocked.CompareExchange。他のスレッドは失敗しInterlocked.CompareExchange、次にから 1 を受け取りreturnます。

private int OnlyFirst = 0;

private void doWork()
{
    if (Interlocked.CompareExchange(ref OnlyFirst, 1, 0) != 0)
    {
        return;
    }
于 2013-08-31T16:57:49.907 に答える
0
// Flag that will only be "true" for the first thread to enter the method.
private bool isFirstThread = true;

// The "Synchronized" option ensures that only one thread can execute the method
// at a time, with the others getting temporarily blocked.
[MethodImplOptions.Synchronized]
private void firstThread()
{
    if (isFirstThread)
    {
        //do some work
        loopCount=0;

        isFirstThread = false;
    }
}
于 2013-08-31T16:56:06.563 に答える