Ответ на ваш вопрос: 256² = 65536 в квадрате вместо куба, потому что вы удалили синий цвет.
Учитывая адрес "4", Вероятно, "этот" указатель является нулевым, или итератор плох. Необходимо смочь видеть это в отладчике. Если это является пустым, то проблема не находится в той функции, но кто когда-либо вызывает ту функцию. Если итератор плох, то это - состояние состязания, на которое Вы сослались. Большинство итераторов не может терпеть обновляемый список.
Хорошо ожидайте - Никакой FM здесь. Помехи инициализируются на первом использовании. Код, который делает это, не мультиориентирован на многопотоковое исполнение. один поток делает инициализацию, в то время как 2-е думает, что было уже сделано, но это все еще происходит. Результат, это - использование неинициализированная переменная. Вы видите это в блоке ниже:
static x y;
004113ED mov eax,dword ptr [$S1 (418164h)]
004113F2 and eax,1
004113F5 jne wmain+6Ch (41141Ch)
004113F7 mov eax,dword ptr [$S1 (418164h)]
004113FC or eax,1
004113FF mov dword ptr [$S1 (418164h)],eax
00411404 mov dword ptr [ebp-4],0
0041140B mov ecx,offset y (418160h)
00411410 call x::x (4111A4h)
00411415 mov dword ptr [ebp-4],0FFFFFFFFh
$S1 установлен на 1 когда это init's. Если установлено, (004113F5) это перепрыгивает через код init - замораживание потоков в fnc не поможет, потому что эта проверка сделана на записи в функцию. Это не является пустым, но один из участников.
Зафиксируйте путем перемещения карты из метода и в класс как статичной. Затем это инициализирует на запуске. Иначе необходимо поместить CR вокруг вызовов, делают DoStuff (). Можно защитить от остающихся проблем MT путем размещения CR вокруг использования самой карты (например, где DoStuff использует оператор []).
mappedChars статичен, таким образом, он совместно используется всеми потоками, которые выполняют DoStuff (). Тот один могла быть Ваша проблема.
Если необходимо использовать статическую карту, то Вы, возможно, должны защитить ее со взаимным исключением или критическим разделом.
Лично, я думаю с помощью карты, с этой целью излишество. Я записал бы функцию помощника, которая берет символ и вычитает '0' из него. У Вас не будет проблем потокобезопасности с функцией.
Если несколько потоков вызывают функцию DoStuff
это будет означать, что инициализация кодирует
if (mappedChars.empty())
может ввести состояние состязания. Это означает, что поток 1 вводит функцию, находит карту пустой и начинает заполнять ее. Распараллельте 2, затем вводит функцию и находит, что непустая карта (но не полностью инициализированная) так весело начинает читать ее. Поскольку оба потока находятся теперь в конкуренции, но каждый изменяет структуру карты (т.е. вставляет узлы), неопределенное поведение (катастрофический отказ) закончится.
Если Вы используете синхронизацию, примитивную до проверки карты для empty()
, и выпущенный после того, как карта, как гарантируют, будет полностью инициализирована, все будут хорошо.
Я взглянул через Google, и действительно статическая инициализация не ориентирована на многопотоковое исполнение. Таким образом объявление static mappedChars
сразу проблема. Поскольку другие упомянули, что было бы лучше, если бы Ваша инициализация была сделана, когда только 1 поток, как гарантируют, будет активен в течение времени жизни инициализации.
Вы когда-либо звоните operator[]
с аргументом это не находится в диапазоне 0..9
? Если так, затем Вы непреднамеренно изменяете карту, которая, вероятно, заставляет вредность происходить в других потоках. Если Вы звоните operator[]
с аргументом не уже в карте, это вставляет тот ключ в карту со значением, равным значению по умолчанию типа значения (0 в случае int
).
При вхождении в многопоточность обычно существует слишком много продолжения точно определить точное пятно, где вещи разлагаются, так как это будет всегда изменяться. Существует тонна пятен, где использование статической карты в многопоточной ситуации могло разложиться.
Посмотрите этот поток для некоторых способов охранять статическую переменную. Ваш лучший выбор состоял бы в том, чтобы, вероятно, вызвать функцию, однажды запускающую несколько потоков для инициализации его. Или это, или выгоняет статическую карту с квартиры и создает отдельный метод инициализации.