Местоположение чтения нарушения в станд.:: оператор карты []

Ответ на ваш вопрос: 256² = 65536 в квадрате вместо куба, потому что вы удалили синий цвет.

7
задан Marcin 23 October 2008 в 23:31
поделиться

5 ответов

Учитывая адрес "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 использует оператор []).

5
ответ дан 6 December 2019 в 23:15
поделиться

mappedChars статичен, таким образом, он совместно используется всеми потоками, которые выполняют DoStuff (). Тот один могла быть Ваша проблема.

Если необходимо использовать статическую карту, то Вы, возможно, должны защитить ее со взаимным исключением или критическим разделом.

Лично, я думаю с помощью карты, с этой целью излишество. Я записал бы функцию помощника, которая берет символ и вычитает '0' из него. У Вас не будет проблем потокобезопасности с функцией.

3
ответ дан 6 December 2019 в 23:15
поделиться

Если несколько потоков вызывают функцию DoStuff это будет означать, что инициализация кодирует

if (mappedChars.empty())

может ввести состояние состязания. Это означает, что поток 1 вводит функцию, находит карту пустой и начинает заполнять ее. Распараллельте 2, затем вводит функцию и находит, что непустая карта (но не полностью инициализированная) так весело начинает читать ее. Поскольку оба потока находятся теперь в конкуренции, но каждый изменяет структуру карты (т.е. вставляет узлы), неопределенное поведение (катастрофический отказ) закончится.

Если Вы используете синхронизацию, примитивную до проверки карты для empty(), и выпущенный после того, как карта, как гарантируют, будет полностью инициализирована, все будут хорошо.

Я взглянул через Google, и действительно статическая инициализация не ориентирована на многопотоковое исполнение. Таким образом объявление static mappedChars сразу проблема. Поскольку другие упомянули, что было бы лучше, если бы Ваша инициализация была сделана, когда только 1 поток, как гарантируют, будет активен в течение времени жизни инициализации.

2
ответ дан 6 December 2019 в 23:15
поделиться

Вы когда-либо звоните operator[] с аргументом это не находится в диапазоне 0..9? Если так, затем Вы непреднамеренно изменяете карту, которая, вероятно, заставляет вредность происходить в других потоках. Если Вы звоните operator[] с аргументом не уже в карте, это вставляет тот ключ в карту со значением, равным значению по умолчанию типа значения (0 в случае int).

0
ответ дан 6 December 2019 в 23:15
поделиться

При вхождении в многопоточность обычно существует слишком много продолжения точно определить точное пятно, где вещи разлагаются, так как это будет всегда изменяться. Существует тонна пятен, где использование статической карты в многопоточной ситуации могло разложиться.

Посмотрите этот поток для некоторых способов охранять статическую переменную. Ваш лучший выбор состоял бы в том, чтобы, вероятно, вызвать функцию, однажды запускающую несколько потоков для инициализации его. Или это, или выгоняет статическую карту с квартиры и создает отдельный метод инициализации.

1
ответ дан 6 December 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: