2016-03-06 5 views
0

Как синхронизировать потоки для совместной работы. Например:C# (.net 3.5) run thread together

code 
Code section A 
code 

Я хочу, чтобы каждый 5 нить войдет вместе разрезу А

+2

Таким образом, вы хотите, чтобы каждый поток блокировался до тех пор, пока не будет заблокировано 5, а затем отпустите их все? Можем ли мы спросить, почему? (Это звучит как довольно необычное требование.) –

+0

@JonSkeet Да, я знаю. Я изучаю ошибку, которая у меня есть с одной из моих DLL сторонних разработчиков. В некоторых случайных случаях multhithread у меня было исключение с поврежденной памятью без какой-либо логики. – yudi

+0

Я не понимаю, почему это было бы решением этого ... или вы просто пытаетесь его спровоцировать? –

ответ

0

Вот некоторые примеры кода, который показывает, как использовать Barrier класс ждать 5 потоков для всех быть на то же самое в коде, прежде чем разрешить продолжить.

Чтобы попробовать, запустите его, а затем^C, чтобы остановить его через некоторое время, и проверьте время, когда потоки проходят через барьер. Вы увидите, что он ждет, пока на барьере не останется всего 5 нитей, затем все они будут выпущены сразу (после чего Барьер ждет, что следующие 5 потоков будут готовы).

using System; 
using System.Diagnostics; 
using System.Threading; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main() 
     { 
      Barrier barrier = new Barrier(5); // 5 == #participating threads. 
      Action[] actions = new Action[10]; 
      var sw = Stopwatch.StartNew(); 
      ThreadPool.SetMinThreads(12, 12); // Prevent delay on starting threads. 
               // Not recommended for non-test code! 
      for (int i = 0; i < actions.Length; ++i) 
       actions[i] =() => test(barrier, sw); 

      Parallel.Invoke(actions); 
     } 

     static void test(Barrier barrier, Stopwatch sw) 
     { 
      int id = Thread.CurrentThread.ManagedThreadId; 
      Random rng = new Random(id); 

      while (true) 
      { 
       int wait = 5000 + rng.Next(5000); 
       Console.WriteLine($"[{sw.ElapsedMilliseconds:000000}] Thread {id} is sleeping for {wait} ms."); 
       Thread.Sleep(wait); 
       Console.WriteLine($"[{sw.ElapsedMilliseconds:000000}] Thread {id} is waiting at the barrier."); 
       barrier.SignalAndWait(); 
       Console.WriteLine($"[{sw.ElapsedMilliseconds:000000}] Thread {id} passed the barrier."); 
       Thread.Sleep(1000); // This is the equivalent of your "Section A". 
      } 
     } 
    } 
}