W ostatniej wersji C# pojawiła się możliwość zrównoleglenia obliczeń w bardzo prosty sposób. Pętlę:
for (int n = 0; n < 8; n++) { Console.WriteLine("Normal - iteracja {0} wątek {1}", n, Thread.CurrentThread.ManagedThreadId); }[/code] <p style="text-align: justify;">można zastąpić następującą konstrukcją:</p> [code lang="csharp"]Parallel.For(0, 8, i => { Console.WriteLine("Parallel - iteracja {0} wątek {1}", i, Thread.CurrentThread.ManagedThreadId); });
Zapis ten powinien spowodować, że obliczenia będą przeprowadzane równolegle. Według mnie pomysł jest super. Jedna linijka zastępuje wiele linijek, które należało napisać w przypadku wątków. W trakcie używania Parallel.For należy pamiętać, że kod ten będzie zachowywał się jak kod wykonywany wielowątkowo, czyli nie będzie wiadomo w jakiej kolejności będą wykonywały się poszczególne etapy pętli. Dodatkowo należy pamiętać o problemie współdzielenia zmiennych.
Należy też zauważyć, że nie zawsze poszczególne operacje będą wykonywały się równolegle. Czasem po prostu nie ma takiej potrzeby. Uruchamiając ten kod można jednym razem otrzymać następujące wyniki:
Parallel - iteracja 0 wątek 1 Parallel - iteracja 1 wątek 1 Parallel - iteracja 2 wątek 1 Parallel - iteracja 4 wątek 3 Parallel - iteracja 6 wątek 3 Parallel - iteracja 7 wątek 3 Parallel - iteracja 3 wątek 1 Parallel - iteracja 5 wątek 4
Widać tutaj, że nie jest zachowana kolejność obliczeń w pętli, jak również obliczenia te są wykonywane przez trzy różne wątki.
Innym razem można otrzymać następujący wynik:
Parallel - iteracja 0 wątek 1 Parallel - iteracja 1 wątek 1 Parallel - iteracja 2 wątek 1 Parallel - iteracja 3 wątek 1 Parallel - iteracja 4 wątek 1 Parallel - iteracja 5 wątek 1 Parallel - iteracja 6 wątek 1 Parallel - iteracja 7 wątek 1
W tym przypadku obliczenia wykonywane są tylko przez jeden wątek pomimo braku zmiany w kodzie.
Na koniec pozostaje jeszcze kwestia rozważania wydajności tego rozwiązania. Co jest szybsze, klasyczne iteracyjne podejście, wątki, czy Parallel.For. Ale tego bez przeprowadzenia testów nie da się sprawdzić. I to jest właśnie zadaniem na najbliższy okres.
Zostaw komentarz