Dieser Artikel wurde maschinell übersetzt. Wenn Sie die englische Version des Artikels anzeigen möchten, aktivieren Sie das Kontrollkästchen Englisch. Sie können den englischen Text auch in einem Popupfenster anzeigen, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch
Informationen
Das angeforderte Thema wird unten angezeigt. Es ist jedoch nicht in dieser Bibliothek vorhanden.

_AcquireSpinLock

[Diese Dokumentation ist nur eine Vorschau und wird in späteren Versionen ggf. geändert. Blank topics are included as placeholders.]

Microsoft-spezifisch

Wird verwendet, um einen kritischen Abschnitt zu erhalten, garantierend effektiv, dass kein anderer Thread in der Lage ist, den Codepfad zwischen dem Aufruf von _AcquireSpinLock und dem Aufruf von _ReleaseSpinLockauszuführen.


          
void _AcquireSpinLock(
   unsigned __int64 * Lock
)
        

[out] Lock

Die Lock: variable Wird auf 1 festgelegt, wenn eine Sperre abgerufen wird.

Andere Threads, die _AcquireSpinLock-Block und den Thread mit der Sperre auszuführen, ruft _ReleaseSpinLockan.

Diese Routine ist als systeminterne Funktion nur verfügbar.

Intrinsisch

Architektur

_AcquireSpinLock

IPF

Headerdatei <intrin.h>

// spinlock.cpp
// compile with: /MT 
// processor: IPF

#include <cstdlib>
#include <cstdio>
#include <process.h>
#include <windows.h>
#include <intrin.h>
 
#pragma intrinsic(_AcquireSpinLock, _ReleaseSpinLock)

// Data to protect.

volatile LONG data = 0;
unsigned __int64 lock = 0;  
void __cdecl SimpleThread(void* pParam);
const int THREAD_COUNT = 6;

int main()
{
    DWORD num;
    HANDLE threads[THREAD_COUNT];
    int args[THREAD_COUNT];
    int i;

    for (i = 0; i < THREAD_COUNT; i++)
    {
        args[i] = i+1;
        threads[i] = 
             reinterpret_cast<HANDLE>(_beginthread(SimpleThread,
                                      0, args + i));
        if (threads[i] == reinterpret_cast<HANDLE>(-1))
        {
            // Error creating threads
            break;
       }
    }
 
    WaitForMultipleObjects(i, threads, true, INFINITE);
}

// Code for the simple thread
void __cdecl SimpleThread(void* pParam)
{
    int thread = *( (int*) pParam);
    int k = 1;

    _AcquireSpinLock(&lock);

    int x1 = data++;
    for (int i = 0; i < 10000; i++)
    {
        // Perform some calculations to create a delay
        k += i;
        k %= 10000;
    }
    int x2 = data++;   
   
    printf_s("%I64d %d %d %d\n", lock, thread, x1, k);
    printf_s("%I64d %d %d %d\n", lock, thread, x2, k);

    _ReleaseSpinLock(&lock);

    if (x2 - x1 != 1)
        printf_s("Error!\n");
}
          1 1 0 5001
1 1 1 5001
1 3 2 5001
1 3 3 5001
1 2 4 5001
1 2 5 5001
1 4 6 5001
1 4 7 5001
1 5 8 5001
1 5 9 5001
1 6 10 5001
1 6 11 5001
        
Anzeigen: