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.html

    cu



  • 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


Anmelden zum Antworten