Синхронизация нескольких потоков - C#
Формулировка задачи:
Здравствуйте! Имеются несколько потоков, в каждом из которых выполняются два и более методов. Необходимо синхронизировать их. Пробовал использовать класс barrier, но результат не тот:
Мне нужно обеспечить последовательный вызов методов из разных потоков: сначала , а потом . То есть метод Client всегда должен выполняться после метода Server с тем же параметром. Вот все имеющиеся зависимости: {process_1.Server("1 and 2"); process_2.Client("1 and 2");}, {process_2.Server("2 and 5"); process_5.Client("2 and 5");}, {process_6.Server("6 and 4"); process_4.Client("6 and 4");}, {process_4.Server("4 and 7"); process_7.Client("4 and 7");}, {process_1.Server("1 and 3"); process_3.Client("1 and 3");}, {process_2.Server("2 and 3"); process_3.Client("2 and 3");}, {process_4.Server("4 and 3"); process_3.Client("4 and 3");}, {process_5.Server("5 and 3"); process_3.Client("5 and 3");}, {process_6.Server("6 and 3"); process_3.Client("6 and 3");}, {process_7.Server("7 and 3"); process_3.Client("7 and 3");}.
Методы, заключенные в {...} должны обязательно выполняться в указанной последовательности. Но сами эти скобки могут запускаться в любой последовательности. То есть возможно сначала выполнить {process_6.Server("6 and 3"); process_3.Client("6 and 3");}, а потом {process_7.Server("7 and 3"); process_3.Client("7 and 3");}. Но и наоборот тоже будет правильно: {process_7.Server("7 and 3"); process_3.Client("7 and 3");}, {process_6.Server("6 and 3"); process_3.Client("6 and 3");}.
Подскажите, какие методы синхронизации нужно использовать? Заранее спасибо!
Barrier barrier = new Barrier(2); // 2 = #threads participating. bool complete = false; TaskFactory factory = Task.Factory; // Start tasks Task task_1 = factory.StartNew(() => { process_1.Server("1 and 2"); barrier.SignalAndWait(); // Wait for task 2 to catch up. barrier.SignalAndWait(); // Wait for task 2 to print "2" and set complete = true. if (complete) { process_1.Server("1 and 3"); } }); Task task_6 = factory.StartNew(() => { process_6.Server("6 and 4"); process_6.Server("6 and 3"); }); Task task_2 = factory.StartNew(() => { barrier.SignalAndWait(); // Wait for task 1 to print "1". process_2.Client("1 and 2"); complete = true; barrier.SignalAndWait(); // Wait for task 1 to read complete as true. process_2.Server("2 and 5"); process_2.Server("2 and 3"); }); Task task_4 = factory.StartNew(() => { process_4.Client("6 and 4"); process_4.Server("4 and 7"); process_4.Server("4 and 3"); }); Task task_5 = factory.StartNew(() => { process_5.Client("2 and 5"); process_5.Server("5 and 3"); }); Task task_7 = factory.StartNew(() => { process_7.Client("4 and 7"); process_7.Server("7 and 3"); }); Task task_3 = factory.StartNew(() => { process_3.Client("1 and 3"); process_3.Client("2 and 3"); process_3.Client("4 and 3"); process_3.Client("5 and 3"); process_3.Client("6 and 3"); process_3.Client("7 and 3"); }); task_3.Wait();
process_1.Server("1 and 2");
process_2.Client("1 and 2");
Решение задачи: «Синхронизация нескольких потоков»
textual
Листинг программы
Server(object pipeName) { //.... Client(object pipeName) }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д