Как синхронизировать потоки для совместной работы. Например:C# (.net 3.5) run thread together
code
Code section A
code
Я хочу, чтобы каждый 5 нить войдет вместе разрезу А
Как синхронизировать потоки для совместной работы. Например:C# (.net 3.5) run thread together
code
Code section A
code
Я хочу, чтобы каждый 5 нить войдет вместе разрезу А
Вот некоторые примеры кода, который показывает, как использовать 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".
}
}
}
}
Таким образом, вы хотите, чтобы каждый поток блокировался до тех пор, пока не будет заблокировано 5, а затем отпустите их все? Можем ли мы спросить, почему? (Это звучит как довольно необычное требование.) –
@JonSkeet Да, я знаю. Я изучаю ошибку, которая у меня есть с одной из моих DLL сторонних разработчиков. В некоторых случайных случаях multhithread у меня было исключение с поврежденной памятью без какой-либо логики. – yudi
Я не понимаю, почему это было бы решением этого ... или вы просто пытаетесь его спровоцировать? –