lock
-
was machst in assembler dieser code: lock xadd dword ptr [ecx],eax
das sind 2 befehle? was macht das lock?
hab nur mal was hier gefunden:
http://www.codemaestro.com/reviews/review00000104.htmlcu
-
LOCK bewirkt ein "Verschliessen" des nächsten Befehls für den Zugriff auf Speicherstellen.(ist nur mit bestimmten Folgebefehlen wirksam
...add, and, dec, inc, xor, sub, neg, not, or und andere). Während LOCK aktiv ist, hat der Prozessor das alleinige Zugriffsrecht auf
diese Speicherstelle. Damit wird sichergestellt, dass kein anderer Prozessor gleichzeitig auf die gleiche Speicherstelle zugreifen kann.
-
wie deaktiviert man das lock wieder?
-
asmm schrieb:
wie deaktiviert man das lock wieder?
ist nicht nötig weil es nur für einen befehl ist.
-
mit sowas baut man ja sicherlich auch ne critical section nach? wie wird es dann gemacht?
cu
-
freak11 hm?
-
lock xadd dword ptr [ECX], EDX inc EDX
nehmen wir mal an ich hab mehrere threads, lock und dann ein inc...
der erste thread der lock ausgefuehrt hat, kann inc ausfuehren
will aber in der zwischenzeit ein anderer thread lock und inc ausfuehren
klappt das nicht weil die Speicherstelle gesperrt ist solange inc nicht ausgefuert ist! bleibt er dann bei lock stehen????wie baut man ein lock fuer laengeren zu schuezenden code zb.: inc dann ein sub und ein or...?
-
[Halbwissen]
Hab' noch nie ein OS so weit geschrieben, dass ich mich ernsthaft mit diesem Befehl haette beschaeftigen muessen, daher...asmm schrieb:
lock xadd dword ptr [ECX], EDX inc EDX
nehmen wir mal an ich hab mehrere threads, lock und dann ein inc...
der erste thread der lock ausgefuehrt hat, kann inc ausfuehren
will aber in der zwischenzeit ein anderer thread lock und inc ausfuehren
klappt das nicht weil die Speicherstelle gesperrt ist solange inc nicht ausgefuert ist! bleibt er dann bei lock stehen????lock laesst AFAIK tatsaechlich keine Ausfuehrung von nachfolgendem Code zu, bis der Befehl mit diesem Praefix ausgefuehrt wurde.
Der erste Thread bleibt also an diesem Befehl haengen, bis alles erledigt ist, und andere threads wuerden an dieser Stelle gestoppt, bis der Zugriff frei ist. Spielt aber wie gesagt bei EinCPU-Systemen eher selten eine Rolle...asmm schrieb:
wie baut man ein lock fuer laengeren zu schuezenden code zb.: inc dann ein sub und ein or...?
Ein lock gehoert jeweils vor jeden Befehl, der einen gesperrten Speicherbereich braucht.
[/Halbwissen]
-
lock xadd dword ptr [ECX], EDX
irgendwie seh ich bei diesem befehl keinen nutzen...hab mal debuggt, aber es wird hier nichts addiert...normal macht xadd ja sowas:
pseudocode:xadd dest, source temp := dest dest := dest + source source := temp
-
xadd in bezug auf sowas
__inline int atomic_increment(int *dest) { __asm { mov edx, dest; mov eax, 1; /*lock*/ xadd dword ptr [edx], eax; inc eax; } }
quelle: http://www.jbox.dk/sanos/source/include/atomic.h.html