为什么此代码段无法产生错误的共享效果?

时间:2016-02-15 11:23:35

标签: c++ false-sharing

我尝试制作一个可以重现虚假共享方案的小片段。这就是我想出的:

#include <thread>
#include <cstdlib>
#include <vector>

const size_t s_nNumberOfThreads = 16;

volatile __declspec(align(64)) int s_pValues[s_nNumberOfThreads];

void IncrementValue(size_t nValueIndex)
{
    int nValue = 0;
    s_pValues[nValueIndex] = nValue;
    while (true)
    {
        if (s_pValues[nValueIndex] != nValue)
        {
            break;
        }
        nValue++;
        s_pValues[nValueIndex] = nValue;
    }
    // We messed up the memory
    int i = 3; // Breakpoint here
}

int main(int argc, char** argv)
{
    std::vector<std::thread> Threads;
    size_t nThreadIndex = 0;
    while (nThreadIndex < s_nNumberOfThreads)
    {
        Threads.push_back(std::thread(IncrementValue, nThreadIndex++));
    }
    for(auto &Thread : Threads)
    {
        Thread.join();
    }
    return EXIT_SUCCESS;
}

然而,在VS2013下在调试版本中运行它(因此没有优化),无法产生任何错误 - 没有命中断点,线程也不会退出。我的示例是不准确的还是有什么东西阻止它在单个物理CPU上暴露虚假共享?

0 个答案:

没有答案