Почему этот фрагмент не дает ложных эффектов совместного использования?

Я попытался сделать небольшой фрагмент, который воспроизводит сценарий ложного обмена. Вот что я придумал:

#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 в отладочной сборке (без оптимизации) не приводит к каким-либо ошибкам — точка останова не достигнута и потоки не завершаются. Является ли мой пример неточным или что-то мешает выставить ложные данные об одном физическом процессоре?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector