using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace CourseWork_code { #region Ініціалізація головних змінних в проекті class Shared { public static int N = 6; public static int H = N / 2; public static int[] A; public static int[] B; public static int[] Z; public static int[,] MC; public static int[,] MD; public static int[,] CalcMO; public static int[] CalcMP; public static Semaphore T1Data = new Semaphore(10, 10); public static Semaphore T2Data = new Semaphore(10, 10); public static Semaphore T3Data = new Semaphore(10, 10); public static Semaphore T4Data = new Semaphore(10, 10); public static Semaphore T1Release = new Semaphore(10, 10); public static Semaphore T2Release = new Semaphore(10, 10); public static Semaphore T3Release = new Semaphore(10, 10); public static Semaphore T4Release = new Semaphore(10, 10); public static Mutex T1Copy = new Mutex(); public static Mutex T2Copy = new Mutex(); public static Mutex T3Copy = new Mutex(); public static Mutex T4Copy = new Mutex(); } #endregion class T1 { public Thread thread_1; public T1(string name) { thread_1 = new Thread(new ThreadStart(this.Run)); thread_1.Name = name; thread_1.Start(); } void Run() { Console.Write("\nFirst thread started!"); Shared.T1Data.WaitOne(); #region Ініціалізація даних Shared.A = new int[Shared.N]; Shared.Z = new int[Shared.N]; for (int i = 0; i < Shared.N; i++) { Shared.A[i] = 0; Shared.Z[i] = 1; } #endregion Console.Write("A = "); for (int i = 0; i < Shared.N; i++) { Console.Write($"{Shared.A[i]} "); } Shared.T1Data.Release(); Shared.T1Copy.WaitOne(); #region Копіювання даних int[] B1 = new int[Shared.N]; for (int i = 0; i < Shared.N; i++) { B1[i] = Shared.B[i]; } int[,] MC1 = new int[Shared.N, Shared.N]; for (int i = 0; i < Shared.N; i++) { for (int j = 0; j < Shared.N; j++) { MC1[i, j] = Shared.MC[i, j]; } } #endregion Shared.T1Copy.ReleaseMutex(); Shared.T1Release.WaitOne(); #region Обчислення задачі Shared.CalcMO = new int[Shared.N, Shared.N]; for (int t = 0; t < Shared.N; t++) { for (int i = 0; i < Shared.N; i++) { for (int j = 0; j < Shared.N; j++) { Shared.CalcMO[i, j] += MC1[i, t] * Shared.MD[t, j]; } } } Shared.CalcMP = new int[Shared.N]; for (int i = 0; i < Shared.N; i++) { for (int j = 0; j < Shared.N; j++) { Shared.CalcMP[i] += B1[i] * Shared.CalcMO[i, j]; } } for (int i = 0; i < Shared.N; i++) { for (int j = 0; j < Shared.N; j++) { Shared.A[i] = Shared.CalcMP[i] + Shared.Z[i]; } } #endregion Shared.T1Release.Release(); #region Вивід даних Console.Write("A = "); for (int i = 0; i < Shared.N; i++) { Console.Write($"{Shared.A[i]} "); } Console.Write("\nB = "); for (int i = 0; i < Shared.N; i++) { Console.Write($"{Shared.B[i]} "); } Console.WriteLine("\nMC = "); for (int i = 0; i < Shared.N; i++) { for (int j = 0; j < Shared.N; j++) { Console.Write($"{Shared.MC[i, j]} "); } Console.WriteLine(); } Console.WriteLine("MD = "); for (int i = 0; i < Shared.N; i++) { for (int j = 0; j < Shared.N; j++) { Console.Write($"{Shared.MD[i, j]} "); } Console.WriteLine(); } Console.WriteLine("CalcMO = "); for (int i = 0; i < Shared.N; i++) { for (int j = 0; j < Shared.N; j++) { Console.Write($"{Shared.CalcMO[i, j]} "); } Console.WriteLine(); } Console.Write("CalcMP = "); for (int i = 0; i < Shared.N; i++) { Console.Write($"{Shared.CalcMP[i]} "); } #endregion Console.WriteLine("\nFirst thread finished!"); } } class T2 { public Thread thread_2; public T2(string name) { thread_2 = new Thread(new ThreadStart(this.Run)); thread_2.Name = name; thread_2.Start(); } void Run() { Console.Write("\nSecond thread started!"); Shared.T2Data.WaitOne(); #region Ініціалізація даних Shared.B = new int[Shared.N]; for (int i = 0; i < Shared.N; i++) { Shared.B[i] = 1; } Shared.MD = new int[Shared.N, Shared.N]; for (int i = 0; i < Shared.N; i++) { for (int j = 0; j < Shared.N; j++) { Shared.MD[i, j] = 1; } } #endregion Console.Write("\nB = \n"); for (int i = 0; i < Shared.N; i++) { Console.Write($"{Shared.B[i]} "); } Console.WriteLine("MD = \n"); for (int i = 0; i < Shared.N; i++) { for (int j = 0; j < Shared.N; j++) { Console.Write($"{Shared.MD[i, j]} "); } Console.WriteLine(); } Shared.T2Data.Release(); Shared.T2Copy.WaitOne(); #region Копіювання даних int[] B2 = new int[Shared.N]; for (int i = 0; i < Shared.N; i++) { B2[i] = Shared.B[i]; } int[,] MC2 = new int[Shared.N, Shared.N]; for (int i = 0; i < Shared.N; i++) { for (int j = 0; j < Shared.N; j++) { MC2[i, j] = Shared.MC[i, j]; } } #endregion Shared.T2Copy.ReleaseMutex(); Shared.T2Release.WaitOne(); #region Обчислення задачі Shared.CalcMO = new int[Shared.N, Shared.N]; for (int t = 0; t < Shared.N; t++) { for (int i = 0; i < Shared.N; i++) { for (int j = 0; j < Shared.N; j++) { Shared.CalcMO[i, j] += MC2[i, t] * Shared.MD[t, j]; } } } Shared.CalcMP = new int[Shared.N]; for (int i = 0; i < Shared.N; i++) { for (int j = 0; j < Shared.N; j++) { Shared.CalcMP[i] += B2[i] * Shared.CalcMO[i, j]; } } for (int i = 0; i < Shared.N; i++) { for (int j = 0; j < Shared.N; j++) { Shared.A[i] = Shared.CalcMP[i] + Shared.Z[i]; } } #endregion Console.WriteLine("\nSecond thread finished!"); Shared.T2Release.Release(); } } class T3 { public Thread thread_3; public T3(string name) { thread_3 = new Thread(new ThreadStart(this.Run)); thread_3.Name = name; thread_3.Start(); } void Run() { Shared.T3Copy.WaitOne(); Console.Write("\nThird thread started!"); #region Копіювання даних int[] B3 = new int[Shared.N]; for (int i = 0; i < Shared.N; i++) { B3[i] = Shared.B[i]; } int[,] MC3 = new int[Shared.N, Shared.N]; for (int i = 0; i < Shared.N; i++) { for (int j = 0; j < Shared.N; j++) { MC3[i, j] = Shared.MC[i, j]; } } #endregion Shared.T3Copy.ReleaseMutex(); Shared.T3Release.WaitOne(); #region Обчислення задачі Shared.CalcMO = new int[Shared.N, Shared.N]; for (int t = 0; t < Shared.N; t++) { for (int i = 0; i < Shared.N; i++) { for (int j = 0; j < Shared.N; j++) { Shared.CalcMO[i, j] += MC3[i, t] * Shared.MD[t, j]; } } } Shared.CalcMP = new int[Shared.N]; for (int i = 0; i < Shared.N; i++) { for (int j = 0; j < Shared.N; j++) { Shared.CalcMP[i] += B3[i] * Shared.CalcMO[i, j]; } } for (int i = 0; i < Shared.N; i++) { for (int j = 0; j < Shared.N; j++) { Shared.A[i] = Shared.CalcMP[i] + Shared.Z[i]; } } #endregion Console.WriteLine("\nThird thread finished!"); Shared.T3Release.Release(); } } class T4 { public Thread thread_4; public T4(string name) { thread_4 = new Thread(new ThreadStart(this.Run)); thread_4.Name = name; thread_4.Start(); } void Run() { Shared.T4Data.WaitOne(); Console.Write("\nFourth thread started!"); #region Ініціалізація даних Shared.MC = new int[Shared.N, Shared.N]; for (int i = 0; i < Shared.N; i++) { for (int j = 0; j < Shared.N; j++) { Shared.MC[i, j] = 1; } } #endregion Console.WriteLine("\nMC = \n"); for (int i = 0; i < Shared.N; i++) { for (int j = 0; j < Shared.N; j++) { Console.Write($"{Shared.MC[i, j]} "); } Console.WriteLine(); } Shared.T4Data.Release(); Shared.T4Copy.WaitOne(); #region Копіювання даних int[] B4 = new int[Shared.N]; for (int i = 0; i < Shared.N; i++) { B4[i] = Shared.B[i]; } int[,] MC4 = new int[Shared.N, Shared.N]; for (int i = 0; i < Shared.N; i++) { for (int j = 0; j < Shared.N; j++) { MC4[i, j] = Shared.MC[i, j]; } } #endregion Shared.T4Copy.ReleaseMutex(); Shared.T4Release.WaitOne(); #region Обчислення задачі Shared.CalcMO = new int[Shared.N, Shared.N]; for (int t = 0; t < Shared.N; t++) { for (int i = 0; i < Shared.N; i++) { for (int j = 0; j < Shared.N; j++) { Shared.CalcMO[i, j] += MC4[i, t] * Shared.MD[t, j]; } } } Shared.CalcMP = new int[Shared.N]; for (int i = 0; i < Shared.N; i++) { for (int j = 0; j < Shared.N; j++) { Shared.CalcMP[i] += B4[i] * Shared.CalcMO[i, j]; } } for (int i = 0; i < Shared.N; i++) { for (int j = 0; j < Shared.N; j++) { Shared.A[i] = Shared.CalcMP[i] + Shared.Z[i]; } } #endregion Console.WriteLine("\nFourth thread finished!"); Shared.T4Release.Release(); } } class Program { static void Main(string[] args) { Shared shared = new Shared(); Console.WriteLine("Main started"); T1 one = new T1("first"); T2 two = new T2("second"); T3 three = new T3("third"); T4 four = new T4("fourth"); one.thread_1.Join(); two.thread_2.Join(); three.thread_3.Join(); four.thread_4.Join(); Console.WriteLine("\nMain finished"); Console.ReadLine(); } } }