InterlockedIncrement与EnterCriticalSection / counter ++ / LeaveCriticalSection

我有一些multithreading代码(请参阅问题的Windows API线程池简单的例子 ),我正在使用一个计数器来确定一个线程。

我被build议使用InterlockedIncrement在线程的callback函数中增加这个计数器。 但是,这似乎并没有正确地lockingvariables,因为我遇到了一些并发问题。 我用一个关键部分手动replace了InterlockedIncrement:EnterCriticalSection / counter ++ / LeaveCriticalSection,现在这个工作完美无缺。

为什么这样? 这两种select是不是应该严格相等? 请注意,我正在讨论启动一对(约10)的线程。

Solutions Collecting From Web of "InterlockedIncrement与EnterCriticalSection / counter ++ / LeaveCriticalSection"

您的代码没有正确使用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返回唯一递增的值。 如果要查看唯一值,则需要在计算中使用该值。