(0) exportieren Drucken
Alle erweitern
Dieser Artikel wurde maschinell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen.
Übersetzung
Original
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:
© 2014 Microsoft