Hej, mam generalnie taki kodzik na którym mam porównać wielowątkowe sumowanie tablicy vs sekwencyjne. Tylko mam problem z pomiarem czasu. Generalnie kiedy dam Join() na wątek rodzica to mimo to kod z rodzica się kończy i finito, mimo że wątki dzieci pracują. Prosiłbym o radę i jeszcze o sprawdzenie czy prawidłowo zastosowałem Mutex. Generalnie chciałem zastosować jakąś funkcję sprawdzającą w pętli while, ale to znacznie opóźni działanie programu.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace mutex
{
class Program
{
static private Mutex mutx = new Mutex(false, "nazwa_mutexa");
static private int suma_mutex = 0;
//static bool end = false;
static int[] tablica = new int[1000000];
static void Main(string[] args)
{
//tworzenie i uzupełnienie tablicy
for (int i = 0; i < 1000000; i++)
{
tablica[i] = 1;
}
Thread t1 = new Thread(
() => { suma_tablicy(tablica);
});
DateTime startTime = DateTime.Now;// wczytanie wartosci poczatkowej
t1.Start();
t1.Join();
Console.WriteLine(suma_mutex);
DateTime stopTime = DateTime.Now; //wczytanie wartosci koncowej
TimeSpan roznica = stopTime - startTime; // obliczenie czasu wykonania
Console.WriteLine("Czas wykonania " + roznica.TotalMilliseconds + "ms"); // wypisanie czasu wykoania
Console.ReadKey();
}
static void suma_tablicy(int[] tab)
{
Thread pierwszy =new Thread(() =>
{
for (int i = 0; i < 333333; i +=1)
{
mutx.WaitOne(); //mutex on
suma_mutex += tab[i];
mutx.ReleaseMutex();
// Console.WriteLine("Pierwszy");
}
});
Thread drugi = new Thread(() =>
{
for (int i = 333333; i < 666666; i += 1)
{
mutx.WaitOne();
suma_mutex += tab[i];
mutx.ReleaseMutex();
// Console.WriteLine("Drugi");
}
});
Thread trzeci = new Thread(() =>
{
for (int i = 666666; i< 1000000; i++)
{
mutx.WaitOne();
suma_mutex += tab[i];
mutx.ReleaseMutex();
// Console.WriteLine("Trzeci");
}
Console.WriteLine(suma_mutex);
});
pierwszy.Start();
drugi.Start();
trzeci.Start();
}
}
}