Confuzia despre sincronizare fir atunci când două fire apelați aceeași metodă




Am creat o bibliotecă Messenger și l-am făcut fir în condiții de siguranță astfel încât să poată fi partajate între fire în jurul valorii de fără griji. Am realiza acest lucru folosind cea mai mare parte a clasei Monitor.


Am o rutina de deconectare, care poate dura ceva timp pentru a finaliza, deoarece încearcă să aștepte pentru tranzacțiile care au loc înainte de a se închide priza, etc. Este asincron și a începe / metode End, dar pentru acest exemplu ne vom preface doar că e sincron.


Ce se întâmplă dacă două fire suna deconectare, unul imediat după altul? Ce ar trebui să fie faci cu al doilea fir?


În prezent, am bloc (folosind Monitor.Wait să aștepte un puls de la primul fir) până la prima logout completează și apoi arunca o AlreadyLoggedOutException.


De asemenea, am cochetat cu care au o excepție LogoutInProgress aruncată dacă Logout se numește, dar un logout are deja loc.


Ambele par să aibă avantaje și dezavantaje, dar aș vrea să știu ce alți oameni cred că este cel mai bine.
Care este cea mai bună opțiune din doi ați menționat, depinde de modul în care doriți ca biblioteca să se comporte. 


Nu aș arunca excepție de la consumator și pur și simplu foc final logout eveniment asincronă / metoda pentru ambele fire atunci când logout real completează. Ce sincronizare primitiv ar trebui să fie utilizați pentru a realiza acest lucru depinde de proiectarea metodei / bibliotecă. Poate dacă distribuiți mai multe detalii cu privire la metoda de a începe End-ați menționat, voi putea sugera mai bine.


Această opțiune ar fi mai ușor să programeze împotriva.
buna. mi se intampla si mie. incearca sa scoti firul care face conexiune intre pc si imprimanta, astepti catev aseunde, apoi il bagi iar. succes. funda? stii care este faza? daca ii mouse fara fir trebuie sa scoti mufa sufli in ea si o bagi la loc mouse-ul s-a supra-incalzit dar daca ii cu fir iti trebuie mouse nou. păi dacă îl setezi corect el merge o perioadă apoi se oprește peste câteva minute apoi pornește iar si tot așa, nu prea e indicat să-l lași peste noapte dacă nu-l mai verifici din când în când. depinde de joc. la competitive, precum csgo, cod, pubg, trebuie dezactivat. În competitive nu trebuie să ai niciun fel de sincronizare între ecran și placa video. cu cât ai mai multe fps-uri și nu sunt sincronizate direct de către ecran, cu atât ai un target mai precis. acest lucru este valabil doar la competitive, pentru celelalte jocuri însă, poți activa gsync pentru a reduce lagul dintre cadre la frecvența monitorului.

teoretic, regula aceasta, după cum am mai spus și mă repet, se aplică doar la o anumită categorie de jocuri, ți-am enumerat mai devreme cele două categorii (competitive - gsync off) și (necompetitive - gsync on). trebuie sa ai un cap de jack pentru stereo. daca ai doar doua fire inseamna ca e mono. JavaScript nu are suport pentru multi-threading pentru că JavaScript interpret în browser-ul este un singur fir (AFAIK). Chiar și Google Chrome nu va lăsa o singură pagină web JavaScript rulează în același timp, deoarece acest lucru ar provoca distrugeri masive de probleme de concurenta în paginile web existente. Toate Chrome nu este de a separa mai multe componente (diferite tab-uri, plugin-uri, etc.) în procese separate, dar nu-mi pot imagina o singură pagină având mai mult de un JavaScript fir.


Cu toate acestea, puteți utiliza, așa cum a fost sugerat, `setTimeout` pentru a permite un fel de programare și "fals" de concurenta. Acest lucru provoacă browser-ul pentru a recâștiga controlul de redare fir, și începe cod JavaScript furnizate `setTimeout după anumit număr de milisecunde. Acest lucru este foarte util dacă doriți pentru a permite viewport (ceea ce vezi) pentru a actualiza în timp ce efectuează operațiuni pe ea. Doar looping prin exemplu, coordonatele și actualizarea unui element în consecință, vă va face să vezi începutul și sfârșitul poziții, și nimic în între.


Vom folosi o abstracție în bibliotecă JavaScript, care ne permite de a crea procese și fire care sunt toate gestionate de către același JavaScript interpret. Acest lucru ne permite să executați acțiuni în felul următor:


* Un Proces, Firul 1
* Un Proces, Firul 2
* Procesul B, 1 Fir
* Procesul De O, Fir 3
* Un Proces, Thread 4
* Procesul B, Firul 2
* Pauză De Un Proces
* Procesul B, Fir 3
* Procesul B, Fire 4
* Procesul B, Fir 5
* Începe Un Proces
* Un Proces, Thread 5


Aceasta permite o formă de planificare și falsuri paralelism, pornirea și oprirea de fire, etc, dar nu va fi adevărat multi-threading. Nu cred că va fi vreodată puse în aplicare în limba în sine, deoarece adevarat multi-threading este utilă numai în cazul în care browser-ul poate rula o singură pagină, multi-threaded (sau chiar mai mult decât un singur nucleu), iar dificultățile sunt mult mai mari decât posibilitățile suplimentare.


Pentru viitorul JavaScript, check this out:
[https://developer.mozilla.org/presentations/xtech2006/javascript/](https://web.archive.org/web/20170920070053/https://developer.mozilla.org/presentations/xtech2006/javascript/) În cazul acesta, le desfaci ușor cu șurubelnița și vezi dacă nu cumva s-a desprins firul de undeva. dacă nu, e posibil să fie împușcat cablul pe undeva, și trebuie schimbat complet. verifică să vezi dacă led-ul de la fibra optică este roșu (nu mai știu cum se numește). dacă este pe router un led roșu, va trebui să vină să schimbe mufa la fibră. 
cel mai ușor lucru de făcut este să dai restart la router, ori apeși pe butonul de reset, ori îl scoți din priză și îl bagi la loc.
alt lucru ar fi să faci din nou configurația ppoee, cu ajutorul unui calculator/laptop și un cablu de rețea. daca inchizi browserul sau dai shutdown acele evenimente vor fi emise. daca scoti din priza sau ramai fara curent nu vor mai fi emise. este de vină sursa, încearcă să o schimbi. Şi eu am avut aceiaşi problemă, trebuia să-l las 3-4 minute în priză ca să se aprindă, apoi când apăsam butonul de pornire, stătea 2 secunde şi se oprea.