| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > VariantCopy method is not threadsafe |
| Автор: voov 11.9.2008, 15:20 |
| При копировании VARIANT получаю ошибку Access violation reading location. В мсдн пишут, что VariantCopy method is not threadsafe. Мое приложение действительно многопоточное. Кроме того, скомпилированая дэбаг версия запущеная отладчиком студии, работает нормально, а запущеная вне студии получает исключение Access violation reading location. В чем именно опасность метода VariantCopy в многопоточном приложении и как устранить такую опасность? |
| Автор: Andrey44 12.9.2008, 08:42 |
| voov, а может стоит попробовать memcpy или что-то в этом духе? |
| Автор: voov 12.9.2008, 10:26 | ||
а как избежать такой ситуации? можно ли здесь както использовать CriticalSection или нужно по другому копировать? |
| Автор: voov 30.9.2008, 16:22 | ||||
Следующий код:
запущеный отладчиком студии (F5) работает без ошибок. Если запустить приложение вне студии (exe-файл из проводника, например), идут ошибки. Сделал так: запустил приложение вне студии, сделал Attach to process... из студии и вижу такую штуку: 1. ошибки возникают только в том случае, если src содержит массив, но не всякий раз. некоторые вызовы, где src - массив, проходят успешно. 2. в случае возникновения ошибки result (E_INVALIDARG) показывает, что "Параметр задан неверно.". При этом портится src. Вместо safearray of R4 = [3](5.0000000,5.0000000,5.0000000) (до вызова VariantCopy), он показывает safearray of R4 = [0]() (после вызова VariantCopy) и т.п. Получается, что во время выполнения VariantCopy, портится источник данных. Но как, где и почему портится непонятно. src создается перед вызовом этим же потоком и удаляется только после выполнения вышеуказаного кода
Попробую копировать вручную, но энтузиазма нет как и нет уверености, что поможет. Может кто-то все-таки может подсказать что-то дельное? |
| Автор: voov 30.9.2008, 17:09 |
| Вопрос снят. Проблема была связана с освобождением памяти. Долго объяснять, скажу лишь, что ItemData это обертка для варианта, деструктор которой вызывает VariantClear. В одном месте я нашел лишний вызов VariantClear для данных из этой обертки. Из-за чего в деструкторе вызов VariantClear говорил что память заблокирована. После удаления лишнего вызова VariantClear ошибки прекратились. |