Повреждение локальной памяти при параллельном программировании

antake
Дата: 08.05.2015 12:46:30
Доброго дня!

Описываю проблему:
Параллельно работают несолько потоков по схеме master-slaves.
Внутри потока на стеке создается матрица 15*15, инициализируется нулями. Назовем ее A. Потом к этой матрице прибавляются другие матрицы. После всего A вдруг оказывается заполнена значениями в стиле 4e+173, т.е. как будто не инициализирована.
Пробовал создать дебажную переменную, куда сохранить A сразу после ее инициализации. Дебажная матрица оказывается набита очень похожим мусором, но чуток отличающимся. Как будто A изначально не инициализировалась нулями, а потом к ней добавлялись значения, маленькие по сравнению с 4e+173.

Ошибка возникает редко. Малейшее изменение в коде (вставить printf) может убрать ошибку или заметно увеличить частоту.

Не могу вставить код, т.к. самые подозрительные на ошибки места - матрица, параллельность написаны на внутреннем фреймворке. При этом проект болшой и работает давно - едва ли в реализации матрицы и параллельности есть грубые ошибки.

Прошу поделиться опытом или подсказать, откуда вообще такая ошибка может взяться.
antake
Дата: 08.05.2015 12:50:49
Забыл уточнить: компилятор - Visual Studio 2013
Dima T
Дата: 08.05.2015 12:58:58
Доступ к матрице из разных потоков как-то синхронизируется? (mutex, event и т.п.)
Dimitry Sibiryakov
Дата: 08.05.2015 13:11:24

antake
Прошу поделиться опытом или подсказать, откуда вообще такая ошибка может
взяться.

Это поведение типично для обращения к уже освобождённой памяти. DrMemory, кажется,
способен ловить такие ошибки. Используй его.

Posted via ActualForum NNTP Server 1.5

Anatoly Moskovsky
Дата: 08.05.2015 16:27:43
antake
Не могу вставить код, т.к. самые подозрительные на ошибки места - матрица, параллельность написаны на внутреннем фреймворке.

Так давайте код без фреймворка.
Нам все равно смотреть, а не компилировать ))
Anatoly Moskovsky
Дата: 08.05.2015 16:31:24
Моя версия - в поток передается адрес локальной переменной чтобы он заполнил ее данными, и время жизни потока больше времени жизни этой переменной, поэтому когда та же память используется для других переменных, поток продолжает писать туда данные которые не соответствуют типу.
mayton
Дата: 08.05.2015 20:03:36
Автор пишет
Не могу вставить код, т.к. самые подозрительные на ошибки места - матрица, параллельность написаны на внутреннем фреймворке. При этом проект болшой и работает давно - едва ли в реализации матрицы и параллельности есть грубые ошибки.

Во первых надо разобраться что это за фреймворк? Какие у него API.
Что там с мультипоточностью? Методы потокобезопасны или нет?
MasterZiv
Дата: 09.05.2015 05:51:21
antake

Прошу поделиться опытом или подсказать, откуда вообще такая ошибка может взяться.


это ошибка в программе!
без длительного анализа кода разговор бессмысленный.
А возможно и с анализом бессмысленный, придется очень долго сидеть в отладке .

рекомендую для начала воспользоваться любыми анализаторами кода, статическими или типа valgrind/oprofile.
из статич. есть PVS studio, недавно даже у нас тут дали на него ссылку.
MasterZiv
Дата: 09.05.2015 05:57:38
MasterZiv,

www.viva64.com/ru/pvs-studio/
ДохтаР
Дата: 10.05.2015 22:33:58
antake
Доброго дня!

Описываю проблему:
Параллельно работают несолько потоков по схеме master-slaves.
Внутри потока на стеке создается матрица 15*15,


Потоки лазят в стеки других потоков, а
время жизни стековых переменных одного потока никак
не контролируется в соседних потоках.