Tiyeni tiwone momwe mapulogalamu amagwiritsidwira ntchito nthawi imodzi ndi ofanana mu .Net, pogwiritsa ntchito chitsanzo chavuto la nkhomaliro. Dongosololi lili motere, kuchokera ku ulusi / njira yolumikizirana kupita ku mtundu wa zisudzo (m'magawo otsatirawa). Nkhaniyo ingakhale yothandiza kwa munthu amene munamβdziΕ΅a poyamba kapena kukukumbutsaninso zimene mwadziΕ΅a.
Chifukwa chiyani mukudziwa momwe mungachitire izi? Ma Transistors akufika kukula kwawo kochepa, lamulo la Moore likugunda malire a liwiro la kuwala, motero kukula kumawonedwa mu manambala; ma transistors ambiri amatha kupangidwa. Panthawi imodzimodziyo, kuchuluka kwa deta kukukulirakulira, ndipo ogwiritsa ntchito amayembekezera kuyankha mwamsanga kuchokera ku machitidwe. Zikatero, mapulogalamu "abwinobwino", tikakhala ndi ulusi umodzi wokha, sagwiranso ntchito. Tiyenera mwanjira ina kuthetsa vuto la kupha nthawi imodzi kapena nthawi imodzi. Komanso, vutoli liripo pazigawo zosiyanasiyana: pa mlingo wa ulusi, pa mlingo wa ndondomeko, pa mlingo wa makina pa intaneti (machitidwe ogawidwa). .NET ili ndi matekinoloje apamwamba, oyesedwa nthawi kuti athetse mavutowa mwachangu komanso moyenera.
Cholinga
Edsger Dijkstra adafunsa vutoli kwa ophunzira ake kumbuyo mu 1965. Kukonzekera kokhazikitsidwa kuli motere. Pali ena (kawirikawiri asanu) chiwerengero cha afilosofi ndi chiwerengero chomwecho cha mafoloko. Amakhala patebulo lozungulira, mafoloko pakati pawo. Afilosofi amatha kudya kuchokera m'mbale zawo za chakudya chosatha, kuganiza kapena kuyembekezera. Kuti adye, wafilosofi ayenera kutenga mafoloko awiri (wachiwiri amagawana mphanda ndi woyamba). Kutola ndi kuyika mphanda ndi ntchito ziwiri zosiyana. Afilosofi onse ali chete. Ntchito ndikupeza ma aligorivimu kotero kuti onse kuganiza ndi kudyetsedwa bwino ngakhale patapita zaka 54.
Choyamba, tiyeni tiyesetse kuthetsa vutoli pogwiritsa ntchito malo ogawana. Mafoloko amagona patebulo wamba ndipo afilosofi amangowatenga pamene iwo alipo ndi kuwabwezeretsa. Apa ndi pamene mavuto ndi kalunzanitsidwe amayamba, pamene ndendende kutenga mafoloko? chochita ngati palibe pulagi? etc. Koma choyamba, tiyeni tiyambe ndi anthanthi.
Kuti tiyambe ulusi timagwiritsa ntchito dziwe la ulusi kudzera Task.Run njira:
var cancelTokenSource = new CancellationTokenSource();
Action<int> create = (i) => RunPhilosopher(i, cancelTokenSource.Token);
for (int i = 0; i < philosophersAmount; i++)
{
int icopy = i;
// ΠΠΎΠΌΠ΅ΡΡΠΈΡΡ Π·Π°Π΄Π°ΡΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΏΡΠ»Π° ΠΏΠΎΡΠΎΠΊΠΎΠ². ΠΠ΅ΡΠΎΠ΄ RunDeadlock Π½Π΅ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡΡ
// ΡΡΠ°Π·Ρ, Π° ΠΆΠ΄Π΅Ρ ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°. ΠΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΉ Π·Π°ΠΏΡΡΠΊ.
philosophers[i] = Task.Run(() => create(icopy), cancelTokenSource.Token);
}
Phukusi la ulusi lapangidwa kuti lizitha kupanga komanso kuchotsa ulusi. Phukusili lili ndi mndandanda wa ntchito ndipo CLR imapanga kapena kuchotsa ulusi malinga ndi kuchuluka kwa ntchitozi. Dziwe limodzi la AppDomains onse. Dziweli liyenera kugwiritsidwa ntchito pafupifupi nthawi zonse, chifukwa ... palibe chifukwa chodandaula ndi kupanga ndi kuchotsa ulusi, mizere yawo, etc. Mukhoza kuchita popanda dziwe, koma muyenera kuligwiritsa ntchito mwachindunji. Thread, izi ndizothandiza pamilandu pamene tikufunika kusintha ulusi woyambirira, tikakhala ndi ntchito yayitali, pa ulusi wa Foreground, etc.
Mwanjira ina, System.Threading.Tasks.Task class ndi yomweyo Thread, koma ndi mitundu yonse ya zabwino: kuthekera koyambitsa ntchito pambuyo pa chipika cha ntchito zina, kuwabweza ku ntchito, kuwasokoneza mosavuta, ndi zina zambiri. etc. Iwo amafunikira kuthandiza async/kuyembekezera zomanga (Task-based Asynchronous Pattern, syntactic sugar for wait for IO operations). Tikambirana pambuyo pake.
CancelationTokenSource apa pakufunika kuti ulusiwo udzilekeze pa chizindikiro chochokera ku ulusi woyitana.
Pano timayesa kutenga kumanzere ndiyeno foloko yakumanja, ndipo ngati ikugwira ntchito, timadya ndikubwezeretsanso. Kutenga foloko imodzi ndi atomiki, i.e. ulusi uwiri sungathe kutenga imodzi nthawi imodzi (yolakwika: yoyamba imawerenga kuti mphanda ndi yaulere, yachiwiri imachita chimodzimodzi, yoyamba imatenga, yachiwiri imatenga). Za ichi Interlocked.CompareExchange, zomwe ziyenera kukhazikitsidwa pogwiritsa ntchito malangizo a processor (TSL, XCHG), chomwe chimatseka chikumbukiro kuti chiwerenge ndi kulemba motsatizana ndi atomiki. Ndipo SpinWait ndiyofanana ndi zomangamanga while(true) kokha ndi "matsenga" pang'ono - ulusi umatenga purosesa (Thread.SpinWait), koma nthawi zina amadutsa ulusi wina (Thread.Yeild) kapena kugona (Thread.Sleep).
Koma yankho ili silikugwira ntchito, chifukwa ... ulusi posachedwapa (mkati mwa sekondi kwa ine) watsekedwa: afilosofi onse amatenga mphanda wawo wakumanzere, koma palibe wolondola. Gulu la mafoloko ndiye lili ndi mfundo zake: 1 2 3 4 5.
Mu chithunzi, kutsekereza ulusi (deadlock). Chobiriwira chimasonyeza kuphedwa, chofiira chimasonyeza kugwirizanitsa, ndipo imvi imasonyeza kuti ulusi ukugona. Ma diamondi amawonetsa nthawi yoyambitsa ntchito.
Njala ya Afilosofi
Ngakhale kuti simukusowa chakudya chochuluka kuti muganizire, njala ikhoza kukakamiza aliyense kusiya filosofi. Tiyeni tiyesetse kutsanzira mkhalidwe wa njala ya ulusi mu vuto lathu. Njala ndi pamene ulusi ukugwira ntchito, koma popanda ntchito yaikulu, mwa kuyankhula kwina, ndizofanana ndi zomwezo, tsopano ulusi sukugona, koma ukuyang'ana mwachangu chakudya, koma palibe chakudya. Pofuna kupewa kutsekereza pafupipafupi, tidzabwezeretsanso foloko ngati sitingathe kutenga ina.
Pakakhala zolakwika mwachisawawa muzolemba zotere (zimakhalapo nthawi zonse), mwachitsanzo, woyandikana naye adzafotokozedwa molakwika kapena chinthu chomwecho chidzapangidwa. AutoResetEvent kwa onse (Enumerable.Repeat), ndiye afilosofi adzadikirira opanga, chifukwa Kupeza zolakwika mu code yotere ndi ntchito yovuta. Vuto lina ndi yankho limeneli nlakuti silikutsimikizira kuti wafilosofi wina sadzafa ndi njala.
Mayankho osakanizidwa
Tidayang'ana njira ziwiri zolumikizirana, tikakhala m'mawonekedwe a ogwiritsa ntchito ndikuzungulira kuzungulira komanso tikatsekereza ulusi kudzera mu kernel. Njira yoyamba ndi yabwino kwa midadada yayifupi, yachiwiri kwa yayitali. Nthawi zambiri muyenera kudikirira pang'ono kuti kusintha kusinthe mu lupu, ndiyeno kutsekereza ulusi pamene kudikira kwatalika. Njirayi ikugwiritsidwa ntchito mu otchedwa. zojambula zosakanizidwa. Ili ndi mapangidwe ofanana ndi a kernel mode, koma tsopano ndi loop-mode loop: SemaphorSlim, ManualResetEventSlim etc. Mapangidwe otchuka kwambiri apa ndi Monitor, chifukwa mu C # pali odziwika bwino lock mawu ofotokozera. Monitor iyi ndi semaphore yomweyi yokhala ndi mtengo wapamwamba wa 1 (mutex), koma ndi chithandizo chodikirira mu kuzungulira, kubwereranso, Condition Variable pattern (zambiri pamunsimu), ndi zina zotero. Tiyeni tiwone yankho ndi izo.
Mtundu wa Condition Variable umakupatsani mwayi kuti mukwaniritse bwino zomwe mukuyembekezera zazovuta zina. Mu NET sizokwanira, m'malingaliro mwanga, chifukwa... Mwachidziwitso, payenera kukhala mizere ingapo pamitundu ingapo (monga mu Posix Threads), osati pa loko imodzi. Ndiye zikanakhala zotheka kuwapanga iwo afilosofi onse. Koma ngakhale mu mawonekedwe awa amakulolani kufupikitsa code.
Afilosofi ambiri kapena async / await
Chabwino, tsopano titha kuletsa ulusi bwino. Koma bwanji ngati tili ndi anthanthi ambiri? 100? 10000? Mwachitsanzo, talandira zopempha 100000 ku seva yapaintaneti. Kupanga ulusi pa pempho lililonse kudzakhala okwera mtengo, chifukwa kotero ulusi wambiri sudzagwiritsidwa ntchito mofanana. Ndi ma cores ambiri omveka omwe aperekedwa (ndili ndi 4). Ndipo wina aliyense amangotenga chuma. Njira imodzi yothetsera vutoli ndi async / wait pattern. Lingaliro lake ndikuti ntchito sikhala ndi ulusi ngati ikufunika kudikirira kuti chinachake chipitirire. Ndipo chinthu chikachitika, chimayambiranso kuphedwa kwake (koma osati mu ulusi womwewo!). Kwa ife, tidzadikira mphanda.