【发布时间】:2010-12-01 00:59:47
【问题描述】:
我使用 Windows 中的 Interlocked 函数制作了一个非常简单的自旋锁,并在双核 CPU(两个线程递增一个变量)上对其进行了测试;
该程序似乎工作正常(每次都给出相同的结果,当不使用同步时情况并非如此),但 Intel Parallel Inspector 表示在 value += j(见下面的代码)。使用关键部分而不是我的 SpinLock 时,警告会消失。
我的 SpinLock 实现是否正确?这真的很奇怪,因为所有使用的操作都是原子的,并且有适当的内存屏障,它不应该导致竞争条件。
class SpinLock
{
int *lockValue;
SpinLock(int *value) : lockValue(value) { }
void Lock() {
while(InterlockedCompareExchange((volatile LONG*)lockValue, 1, 0) != 0) {
WaitABit();
}
}
void Unlock() { InterlockedExchange((volatile LONG*)lockValue, 0); }
};
测试程序:
static const int THREADS = 2;
HANDLE completedEvents[THREADS];
int value = 0;
int lock = 0; // Global.
DWORD WINAPI TestThread(void *param) {
HANDLE completed = (HANDLE)param;
SpinLock testLock(&lock);
for(int i = 0;i < 1000*20; i++) {
for(int j = 0;j < 10*10; j++) {
// Add something to the variable.
testLock.Lock();
value += j;
testLock.Unlock();
}
}
SetEvent(completed);
}
int main() {
for(int i = 0; i < THREADS; i++) {
completedEvents[i] = CreateEvent(NULL, true, false, NULL);
}
for(int i = 0; i < THREADS; i++) {
DWORD id;
CreateThread(NULL, 0, TestThread, completedEvents[i], 0, &id);
}
WaitForMultipleObjects(THREADS, completedEvents, true, INFINITE);
cout<<value;
}
【问题讨论】:
标签: c++ winapi synchronization spinlock intel-inspector