gpt4 book ai didi

c++ - Intel Inspector 报告我的自旋锁实现中存在数据竞争

转载 作者:可可西里 更新时间:2023-11-01 17:52:53 27 4
gpt4 key购买 nike

我使用 Windows 中的 Interlocked 函数制作了一个非常简单的自旋锁,并在双核 CPU 上对其进行了测试(两个线程递增一个变量);

该程序似乎运行正常(它每次都给出相同的结果,当没有使用同步时情况并非如此),但是Intel Parallel Inspector 说在< em>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;
}

最佳答案

Parallel Inspector 的 data race 文档建议使用关键部分或互斥锁来修复 Windows 上的竞争。其中没有任何内容表明 Parallel Inspector 知道如何识别您可能发明的任何其他锁定机制。

用于分析新颖锁定机制的工具往往是静态工具,它们会查看代码中的每条可能路径,Parallel Inspector 的文档暗示它会执行一次代码。

如果您想尝试新颖的锁定机制,我在学术文献中看到的最常用工具是 Spin model checker .还有 ESP ,这可能会减少状态空间,但我不知道它是否已应用于并发问题,以及 mobility workbench如果您可以在 pi-calculus 中解决您的问题,这将给出分析。 Intel Parallel Inspector 似乎没有这些工具那么复杂,而是旨在使用启发式方法检查常见问题。

关于c++ - Intel Inspector 报告我的自旋锁实现中存在数据竞争,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1470741/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com