Cześć, mam do zrobienia program, który mnoży macierze kwadratowe i musi wykorzystywać semafory do synchronizacji wątków. Problem w tym, że dopiero zaczynam tę tematykę i nie za bardzo ogarniam te semafory, więc nawet nie wiem z jakimi wartościami najlepiej go zainicjować. Tak czy siak dodałem już te wątki i semafor, to macierz wynikowa albo jest wypełniona zerami i program się zamyśla albo są wyliczone tylko niektóre z wierszy. Co mam poprawić?
class Program
{
private static Semaphore semaphore = new Semaphore(0, 1);
static void Main(string[] args)
{
int size;
int[,] a = null, b = null, c = null;
bool isNumeric;
do
{
Console.Write("Podaj wielkość macierzy: ");
isNumeric = int.TryParse(Console.ReadLine(), out size);
}
while (!isNumeric || size < 2);
Console.WriteLine();
SquareMatrix.Init(size, ref a);
SquareMatrix.Init(size, ref b);
SquareMatrix.Init(size, ref c);
SquareMatrix.Fill(a);
SquareMatrix.Fill(b);
Console.WriteLine("Macierz 1:\n");
SquareMatrix.Display(a);
Console.WriteLine("Macierz 2:\n");
SquareMatrix.Display(b);
Console.WriteLine();
DateTime start = DateTime.Now;
for (int i = 0; i < size; i++)
{
Thread thread = new Thread(() => Multiply(i, size, a, b, c));
thread.Start();
}
DateTime stop = DateTime.Now;
Console.WriteLine("Wynik:\n");
SquareMatrix.Display(c);
Console.WriteLine("Czas: " + (stop - start).TotalMilliseconds + " ms");
Console.ReadLine();
}
public static void Multiply(int i, int size, int[,] a, int[,] b, int[,] c)
{
semaphore.WaitOne();
for (int j = 0; j < size; j++)
{
c[i, j] = 0;
for (int k = 0; k < size; k++)
{
c[i, j] += a[i, k] * b[k, j];
}
}
semaphore.Release();
}
}
SquareMatrix to klasa statyczna z metodami do inicjowania macierzy, wypełniania ich liczbami pseudolosowymi oraz wyświetlania, nie ma potrzeby wrzucać jej kodu. Z góry dzięki.