Szép napot !
Alaphelyzet: egy darab Solaris processz, van egy jó nagy platformunk, (C++-ban) ami
tartalmaz egy (konkrétan topológia) adatstruktúrát, ami néha változhat (újra kell olvasni, mert módositják, törölnek/hozzáadnak, stb.)
Ilyenkor (1) write lockoljuk a globális platform lockot (konkrétan omni thread mutex), hogy ne akadjuk össze az alábbival:
A processzünk sok threadben, több CPU magon bejövő eseményeket dolgoz fel, amikből jó sok tud jönni per sec. Mikor bejön egy esemény, turkálni (olvasni) kell az adatstruktúrában, ehhez (2) read lockoljuk a globális platform lockot.
(a sok (2)-es egymást nem zavarja, mert mind csak olvas, mehetnek egyszerre)
Probléma: a mutex megszerzésnek/eleresztésnek van költsége, ami nagy esemény intenzitás esetén jelentős lehet, még akkor is, ha szabad a lock. (nyilvántartjuk az olvasásra várók számát, if-elgetünk, külön mutex van az olvasásra várók számának változtatásához és vizsgálatához, conditional variable a várakozók felébresztéséhez, stb.)
Amin agyalok:
Mivel az (1) viszonylag ritkán történik, ezért az idő túlnyomó részében de facto fölösleges a lockot megszerezni a (2) esetben. Az ötlet az, hogy limitálnám, hogy az (1) pl. csak minden 10. másodpercben történhetne (pl. kivárnánk), ezáltal a többi 9 másodpercben (azaz az idő 90%-ában) ki lehetne hagyni a lockolást a (2) esetekben.
(alternativa, hogy nem idő szerint, hanem iráskor tennénk éles módba a lockot)
A gondom, hogy ehhez is kell egy flag, ami jelzi, hogy 'éles' módban vagyunk-e (azaz egy 10. másodpercben) vagy nem. Ennek a flagnak az állitásához ill. vizsgálatához ugyancsak kéne egy lock, különben a 10. másodperc elején/végén nem lesz biztonságos a működés. Akkor meg ott vagyok, ahol a part szakad, egy mutexet kiváltottam egy másikkal, amit vizsgálni kell rengetegszer, minden eseménynél a (2)-ben.
És ha egy nem éles módban (2)-ben elkezdett olvasás közben üt az óra, és hirtelen éles módba megyünk, akkor az (1) thread simán megkapja a write lockot, és összekuszálja az adatstruktúrát, amin a (2) dobhat egy hátast.
Szóval itt tartok, nem találok fogást a problémán. Pedig *valahogy* meg lehetne úszni a nagyrészt fölösleges lockolásokat, azt sejtem.
Köszi minden konstruktiv tippet.