Odpovídáte na názor ke článku SEH v Linuxu (C++).
[9] Nejsem expert na lock-free algoritmy, i když jsem se s nimi trochu potýkal. Pokud se nepletu, tohle je klasicky ABA problém (http://en.wikipedia.org/wiki/ABA_problem). Top může být odstraněn smazán a znovu použit, jenže jeho next uz ukazuje jinam, takže po odebrání může být na novém topu ukazatel na smazanou pamět.
Tohle se ale neřeší pomoci SEHu. Tady nejen že to selže v případě externí chyby, tady to může selhat i když je vše ok a nenastane žádná neočekávaná situlace. V praxi se to řeší použitím atomického CAS (compare and store)na větší data než je velikost pointeru - tzn nevyměňuje se atomicky jen pointer na top ale zaráz i sušenka (většinou sekvenční číslo, které se při každé operaci se seznamem o jedno zvýší). Tím je zaručeno, že pointer (spolu se sušenkou) nemá nikdy stejnou hodnotu.
Na X86 to není problém, procesory podporují CAS na 64 bitová data. Problém byl ovšem s první generací procesoru x64, které neměli CAS na 128 bitová data. Tam se využívalo toho, že měli interně stejně jen 40 nebo 42 bitovou adresovou sběrnici, tak se pro sušenku použily ty nevyužité bity. A to je jen drobnost. Pokud začnete např. zkoumat jak různě fungují memory bariéry mezi různými procesory (např DEC Alpha může za určitých okolností bariéru ignorovat), zešedivíte z toho.
Tyto věci by člověk neměl impementovat sám, ale využít hotové věci - na Windows napr. InterlockedXxxSList
PS: termín "nezamykatelné" je nešťastný a zavádějící. Pokud už chcete použít český termín pro lock-free, přesnější a výstižnější je bezzámkový
Intenzivně se zabývám programováním zejména v jazyce C++. Vyvíjím vlastní knihovny, vzory, techniky, používám šablony, to vše proto, aby se mi usnadnil život při návrhu aplikací. Pracoval jsem jako programátor ve společnosti Seznam.cz. Nyní jsem se usadil v jednom startupu, kde vyvíjím serverové komponenty a informační systémy v C++
Přečteno 57 608×
Přečteno 27 722×
Přečteno 26 403×
Přečteno 24 367×
Přečteno 22 864×