_AcquireSpinLock

[このドキュメントはプレビュー版であり、後のリリースで変更されることがあります。 Blank topics are included as placeholders.]

Microsoft 固有の仕様 →

効果的に他のスレッドが _AcquireSpinLock の呼び出しと _ReleaseSpinLock の呼び出しの間にコード パスを実行できないことを確認するクリティカル セクションに入るために使用します。

void _AcquireSpinLock(
   unsigned __int64 * Lock
)

パラメーター

  • [出力] Lock
    ロック変数 : ロックを取得したときに 1 に設定します。

解説

ロックを使用して _AcquireSpinLock のスレッドがブロックを実行しようと _ReleaseSpinLock 他のスレッドがを呼び出します。

このルーチンは組み込みとしてのみ使用できます。

必要条件

組み込み

アーキテクチャ

_AcquireSpinLock

IPF

ヘッダー ファイル <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");
}
          
        

参照

Reference

_ReleaseSpinLock

コンパイラ組み込み関数。