Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky

Domáce Hardware Siete Programovanie Softvér Otázka Systémy

Implementujte zámok s viacerými čitateľmi, ktorý dal zámok, ktorý je uvedený v porovnaní a výučbe, čitatelia, ktorí nemôžu predbiehať čakajúcich spisovateľov?

Táto implementácia využíva inštrukciu porovnávanej a SWAP (CAS) na správu zámku s viacerými čitateľmi. Uprednostňuje autorov a zabezpečuje, aby čitatelia nemohli vyhladovať spisovateľov. Nepoužíva však sofistikované mechanizmy vo fronte pre spravodlivosť medzi čitateľmi, takže niektorí čitatelia môžu zažiť dlhšie čakanie ako ostatní.

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 lock ={0};

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 * cieľ, int očakávaný, int požadovaný) {

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.

Najnovšie články

Copyright © počítačové znalosti Všetky práva vyhradené