gpt4 book ai didi

c++ - InterlockedIncrement 与 EnterCriticalSection/counter++/LeaveCriticalSection

转载 作者:可可西里 更新时间:2023-11-01 13:27:43 26 4
gpt4 key购买 nike

我有一些多线程代码(请参阅问题 Windows API Thread Pool simple example),我使用计数器来识别线程。

有人建议我在线程的回调函数中使用 InterlockedIncrement 来递增此计数器。然而,这似乎并没有正确锁定变量,因为我遇到了一些并发问题。我通过手动使用关键部分替换了 InterlockedIncrement:EnterCriticalSection/counter++/LeaveCriticalSection,现在可以完美运行。

为什么会这样?这两个选项不应该是严格等价的吗?请注意,我说的是只启动几个(大约 10 个)线程。

最佳答案

您的代码没有正确使用 InterlockedIncrement

InterlockedIncrement(&(thread.threadCount)); 
DWORD tid = (thread.threadCount-1)%thread.size();

这执行了 thread.threadCount 的原子递增,但是您没有保存原子递增的值,而是忽略它并返回到 thread.threadCount 变量(同时可能已被另一个线程递增)。

在您的情况下,两个线程几乎同时执行了 InterlockedIncrement,将其从 1 递增到 2,然后从 2 递增到 3。然后两个线程都读取 thread.threadCount 并得到 3(然后减去 1 得到最终结果 2)。

正确的代码是

LONG tidUnique = InterlockedIncrement(&(thread.threadCount));
DWORD tid = (tidUnique-1)%thread.size();

唯一的增量值由 InterlockedIncrement 返回。如果您想查看唯一值,则需要在计算中使用该值。

关于c++ - InterlockedIncrement 与 EnterCriticalSection/counter++/LeaveCriticalSection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8393990/

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