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();
}
}
}