Linked List Macros threadsicher?
-
Hallo Freunde,
ist diese Struktur: http://msdn2.microsoft.com/en-us/library/aa491571.aspx
und die dazugehörigen Makros wie InsertHeadList eigentlich Threadfest oder muß man Critical Sections verwenden?
-
Nope da is nix threadsafe.
Threadsafe, was Listen angeht, sind nur bestimmte Funktionen für einfach verkettete Listen im Kernelmode. Weiss aber nimmer wie die Funktionsgruppe genau heisst.
-
ha, danke. du meinst vielleicht dieses: http://msdn2.microsoft.com/en-us/library/aa491605.aspx
Threadsafe weils nur einen pointer hat. Weiss jemand ob es überhaupt möglich ist eine double-linked list threadsafe ohne Critical Sections zu programmieren? Bei einem FIFO weiss ich dass es geht: http://csourcesearch.net/package/audiality/0.1.0/audiality/engine/sfifo.c
-
Die atomaren Funktionen fangen alle mit ExInterlocked... an
ExInterlockedPushEntryList etc.
http://msdn2.microsoft.com/en-us/library/aa490127.aspx
-
Danke!
Ich frage mich nur ob eine Multithreaded linked list nicht ganz ohne locks aufbauen kann. der weg über Locks ist sicher einfacher, aber ich frage mich ob es theoretisch möglich ist, ganz ohne Locks auszukommen.
-
Jo, genau, ExInterlockedXxx, Danke Martin & nichtBitWax.
Eine Liste (doppelt verkettet) ganz ohne Locks aufbauen... kann mir nicht vorstellen wie das gehen sollte. Bei einem "remove" muss man ja beide benachbarten Nodes anpassen. Da dir irgendwo im Speicher liegen können kann man die auch nicht mit einem einzigen CAS (compare and swap) updaten, ganz egal wie gross die max. "breite" für CAS ist.
Vielleicht gibt es irgendwelche Tricks mit denen man es trotzdem lock-free hinbekommen kann, aber ich bin mir ziemlich sicher dass es auf heutigen Systemen wenig Sinn macht. Eine "lock free" Operation für die im Schnitt mehr als 2-3 Interlocked Befehle ausgeführt werden müssen ist halt meist schon langsamer als wenn man dasselbe über einen einfache Spin-Lock synchronisiert.