Esileht > Alustus > Parallel.For Break ja Stop

Parallel.For Break ja Stop


Teises artiklis vaatasime, kuidas kasutada Parallel.For() meetodit. Kuidas silmusest välja pääseda? Jadaprogrammis teeksime nii:

for (int i = 0, i < 20, i++)
{
Console.WriteLine(i);
if (i == 10)
break;
};

Rööplemises võib selle jaoks võib võtta objekti tüübiga ParallelLoopState, mis pakub meetodeid Break() ja Stop().

Break() lõpetab kõik lõimed, kuid garanteerib, et lõpetamise ajaks on iga lõim jõudnud sama väärtuseni, mis oli lõimel, mis kutsus välja katkestuse.

Parallel.For(0, 20, (i, state) =>
{
Console.WriteLine(i);
if (i == 10)
state.Break();
}

Minu katsetuse puhul tähendas see, et väljastati arvud 0, 2, 3, 4, 6, 7, 9, 5, 1, 15, 16, 17, 18, 19, 10, 12, 14, 8. Nagu näed, 11 ja 13 on puudu, sest need lõimed olid juba surnud, aga 0 kuni 10 on kindlalt olemas.

Vastupidiselt sellele katkestab Stop() silmuse töö, sõltumata sellest, millisele tasemele teised lõimed on jõudnud. Seega, kui Stop() juhtub lõimes, mis on teistest parasjagu ees, võivad mõned väärtused vahemikust 0 kuni 10 isegi puudu jääda.

Break() ega Stop() ei garanteeri, et ei käivitada rohkem tsükleid kui vaja, ja see on täiesti loomulik, sest kõik lõimed hakkavad kohe täisvõimsusel hagu andma.

Eeltoodud näidet võiks kiirema pidamasaamise huvides muuta siis nii:

if (i >= 10)
state.Stop();

Kui jadaprogrammis on garanteeritud, et i ==10 ja seejärel i ==11, siis rööpes võib vabalt juhtuda, et esiteks i > 10 ja alles seejärel i==10.

Rubriigid:Alustus Tags: , , ,
  1. Kommentaare veel pole.
  1. No trackbacks yet.

Lisa kommentaar

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Muuda )

Twitter picture

You are commenting using your Twitter account. Log Out / Muuda )

Facebook photo

You are commenting using your Facebook account. Log Out / Muuda )

Google+ photo

You are commenting using your Google+ account. Log Out / Muuda )

Connecting to %s

%d bloggers like this: