_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");
}