Синхронизация нескольких потоков - 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)
}