Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky
Tento kód je koncepčný a musí sa prispôsobiť konkrétnemu programovaciemu jazyku a jeho atómovým operáciám. Funkcia `porovnaj_and_swap` je zástupný symbol; Budete ho musieť nahradiť ekvivalentom vášho jazyka (napr. V C ++).
`` C ++
#include
// Za predpokladu, že sú k dispozícii atómové celé čísla. Nahraďte ekvivalentom vášho jazyka.
// Všimnite si, že použitie jedného atómového celého čísla môže mať dôsledky výkonu
// pre systém s vysokou výmenou. V prípade kódu na úrovni výroby zvážte iné
// Dátové štruktúry pre lepšie škálovanie (napr. Atomické fronty).
#include
trieda multipleadersinglewriterlock {
súkromné:
// 0:Unlocked,> 0:Počet čitateľov, -1:Čakanie spisovateľa
std ::atóm
verejnosť:
void quire_read () {
while (true) {
int current_value =lock.Load ();
if (current_value <0) {// spisovateľ čakajú, skúste to znova
// Vydajte procesor, takže autor má šancu.
// Sofistikovanejšia implementácia môže použiť premennú podmienky.
pokračovať;
} else if (compare_and_swap (&zámok, current_value, current_value + 1)) {
prerušenie; // Úspešne získané čítanie Lock
}
}
}
void release_read () {
zámok--; // Počet čítačiek zníženia. Atómový pokles je rozhodujúci.
}
void quire_write () {
while (true) {
if (porovnaj_and_swap (&Lock, 0, -1)) {// Získajte zámok, ak nie sú čitatelia alebo autori
prerušenie; // Úspešne získané zámok Write Lock
} else {
// Pokúšajte sa, kým nebude úspešný alebo signalizujte stav čakania
pokračovať; // Spin-Wait, nie je ideálny na vysoké tvrdenie
// Sofistikovanejšia verzia by mohla použiť premennú podmienky na zabránenie čakania na zaneprázdnenie.
}
}
}
void release_write () {
zámok =0; // Uvoľnite zámok
}
// funkcia pomocníka (nahradiť porovnaním a výmenou jazyka)
bool porovnaj_and_swap (std ::atóm
return cieľ-> porovnaj_exchange_weak (očakávané, požadované);
}
};
int main () {
Multipleadersinglewriterlock m;
// Príklad použitia
m.acquire_read ();
Std ::cout <<"Reader 1 získaný zámok \ n";
M.Release_read ();
std ::cout <<"Reader 1 vydaný zámok \ n";
m.acquire_write ();
std ::cout <<"spisovateľ získal zámok \ n";
M.Release_Write ();
Std ::cout <<"Usporiadanie spisovateľa vydaný zámok \ n";
m.acquire_read ();
m.acquire_read ();
Std ::cout <<"Reader 2 a 3 Získaný zámok \ n";
M.Release_read ();
M.Release_read ();
std ::cout <<"Reader 2 a 3 vydané zámok \ n";
návrat 0;
}
`` `
Dôležité úvahy:
* spinlocks: Metódy `cupire_write` a` cupire_read` používajú rušné čalá (spinlocks). To je neefektívne pri vysokom spore. V prípade výrobného kódu ho vymeňte premennými podmienok alebo inými synchronizačnými primitívami, aby ste zabránili plytvaniu cyklom CPU.
* hladovanie: Zatiaľ čo autori majú prioritu, čitatelia môžu stále zažiť hladovanie, ak existuje nepretržitý prúd spisovateľov. Sofistikovanejší systém vo fronte by mohol zlepšiť spravodlivosť.
* Atomické operácie: Správnosť tohto zámku sa do značnej miery spolieha na atómovú činnosť operácií `porovnaj_and_swap` a prírastky/pokles. Uistite sa, že vaše zvolené atómové operácie poskytujú potrebné záruky.
* Manipulácia s chybami: Robustná implementácia by zahŕňala spracovanie chýb (napr. Kontrola návratových hodnôt z atómových operácií).
* škálovateľnosť: V prípade scenárov s vysokou čelami zvážte pokročilejšie blokovacie mechanizmy určené pre lepšiu škálovateľnosť.
Tento vylepšený príklad poskytuje robustnejšiu, aj keď stále zjednodušenú implementáciu. V prípade výrobných systémov zvážte použitie zavedených knižníc alebo rámcov, ktoré poskytujú dobre testované a vysoko optimalizované synchronizačné primitívy. Pamätajte, že synchronizácia je zložitá a vyžaduje si dôkladné zváženie potenciálnych rasových podmienok a prekážky výkonu.