Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 193519|Odpoveď: 11

[Zdroj] .net/c# Užívateľský viacvláknový súbežný zámok (reťazec){...} Podrobné vysvetlenie

[Kopírovať odkaz]
Zverejnené 3. 7. 2019 15:25:19 | | | |
Bežné scenáre zneužitia: Aby sme predišli duplicitnému plateniu objednávok spôsobenému opakovaným kliknutím používateľa na tlačidlo platby, používame zámok (číslo objednávky), aby sme zabezpečili, že operáciu na objednávke môže vykonať len jedno vlákno.

Táto myšlienka je dobrá, aspoň lepšia ako uzamknutie (súkromný statický objekt na spracovanie tried), pretože efektom uzamknutia čísla príkazov je zamknutie iba operácie aktuálneho 1 poradia, a ak uzamkne statickú premennú, teda zablokuje všetky príkazy, spôsobí, že všetky príkazy budú zaradené do fronty, čo je zjavne nerozumné.

Môže teda metóda zámku (číslo objednávky) spomenutá na začiatku tohto článku dosiahnuť požadovaný efekt? Najskôr použime nejaký kód na obnovenie scenára používania.

Ak ignorujete používateľské informácie a ďalšie overenia, kód vyzerá približne takto:
Pre kľúčové slovo lock MSDN obsahuje informácie, ktoré sa dajú nájsť na Baidu, a zdá sa, že sa neodporúča používať lock(string), pričom dôvod je rovnaký. Nasledujúci úryvok je prevzatý z rád MSDN ohľadom zámkových reťazcov:

Problém so zámkom ("myLock") nastáva preto, že akýkoľvek iný kód používajúci rovnaký reťazec v procese zdieľa rovnaký zámok.
Táto veta skrýva obrovský mechanizmus, teda "ten istý reťazec".

Čo je to "ten istý reťazec"? Pozri kód:


Sú str1 a str2 tá istá struna vyššie? Odpoveď je ÁNO.

Pozri znova:


Sú str1 a str2 nad stále tou istou strunou? Odpoveď je NIE.

Dobre, vráťme sa k otázke platby objednávky. V našom kóde lock(orderNumber), keď používateľ omylom klikne niekoľkokrát po pretiahnutí ruky, je orderNumber zadávajúci túto akciu zakaždým rovnaký reťazec? Odpoveď je NIE. To znamená, že

Kód, ktorý spracováva vyššie uvedené poradie, v skutočnosti nefunguje ako zámok.

V skutočnosti existujú dva typy porovnávania reťazcov, pozri kód:


Prvý riadok vyššie uvedeného kódu vypíše True a druhý riadok False. Myslím, že rozumieš, čo MSDN myslí pod "rovnakým reťazcom" bez môjho vysvetlenia.

Najlepšie riešenie

Riešenia pre optimálne uzamykacie reťazce:





Demo kód:




Na webovej stránke sa niekedy používa globálna premenná, táto globálna premenná, keď viacerí používatelia pristupujú súčasne, môže vyzerať abnormálne, v tomto čase nastavíme globálny zámok, ale nevýhodou je, že všetky prístupy budú čakať postupne.

V niektorých scenároch môže ten istý používateľ komentovať len raz za 15 sekúnd, ak sa použije globálny zámok, funkcia komentárov bude veľmi pomalá na spracovanie, keď počet používateľov prudko stúpne, čo výrazne ovplyvní používateľský zážitok.

V tomto čase,Môžeme nastaviť zámok pre každého používateľa individuálne, lock(string){...}, a názov zámku môžeme definovať ako:Názov metódy + ID používateľaTýmto spôsobom má každý používateľ nezávislý zámok a pri hodnotení intervalu komentárov to neovplyvní komentáre ostatných používateľov.

(Koniec)




Predchádzajúci:Písanie na LPSTR v MFC
Budúci:OpenSSL bol očividne aktualizovaný, Apache stále zobrazuje starú verziu?
Zverejnené 13. 5. 2022 14:27:17 |
Môže teda metóda zámku (číslo objednávky) spomenutá na začiatku tohto článku dosiahnuť požadovaný efekt? Najskôr použime nejaký kód na obnovenie scenára používania.
 Prenajímateľ| Zverejnené 12. 8. 2023 19:48:15 |
.NET/C# Lock Principle Monitor poskytuje podrobné vysvetlenie
https://www.itsvse.com/thread-9633-1-1.html
Zverejnené 7. 1. 2023 11:22:02 |
Stretol som sa s tým aj vo svojej pracovnej praxi, vďaka autorovi za tento technický článok
Zverejnené 3. 7. 2019 20:02:32 |
To sú dobré veci
Zverejnené 18. 6. 2021 14:24:43 |
Na stránke je zobrazené, že kód nie je možné zobraziť
Zverejnené 29. 6. 2021 0:21:16 |
Pozri sa na kód
Zverejnené 29. 6. 2021 0:54:24 |
Nevidím kód
Zverejnené 14. 5. 2022 10:06:46 |
Naučte sa učiť
Zverejnené 28. 5. 2022 22:03:59 |
Veľmi dobre, učenec
Zverejnené 28. 11. 2022 21:46:47 |
Dá sa asp.net použiť?
Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com