Цитата(kuler @ 12.2.2009, 18:08)
попробуй какую нить критическую секцию
Направление правильное.
Мне на форуме progz.ru/forum сказали следующее:
Цитата('Влад')
Ну, ты влетел!..
1. При каких именно "некоторых обстоятельствах" программа рушится? Попытайся уточнить.
2. У тебя идет некорректная работа с твоим логом в многопоточной программе. Навскидку, с ходу видны такие проблемы:
твоя функция getLog() пытается вернуть копию лога, существовавшего на момент ее вызова. Не факт, что это ей вообще удастся, вот возможный сценарий:
Поток 1 Поток 2
Вызов getLog().
Функция скопировала N первых
элементов, но еще не все!
И в этот момент диспетчер потоков переключает поток!
--------------------------------------------------------
Вызвана функция записи в лог.
Изменен лог с переаллокированием
памяти, все итераторы стали невалидными!
--------------------------------------------------------
Функция пытается продолжить
копирование, и тут-то ба-бах!!!
Используемые ею итераторы уже
невалидны. Все падает!Обрати внимание, что переключение потоков ОС может выполнить в любой момент по своему усмотрению.
3. Неизвестно, что происходит с указателями в исходном логе, когда они становятся невалидными. Обрати внимание, что они просто тупо копируются (поскольку это POD) в копию, возвращенную фунцией getLog(). На ровном месте ты можешь поиметь кучу проблем вплоть до расстрела совершенно случайной памяти.
Я бы порекомендовал в param и words использовать либо vector<int>, либо (с меньшими накладными расходами, хотя непонятно, существенно ли это в твоем случае) boost::shared_array или аналог. Ну или, на худой конец, определить для LOGRECORD конструктор копирования и оператор=.
4. Абсолютно необходим синхронизирующий объект. Для Win32/MFC это, видимо, CCriticalSection, для posix - pthread_mutex_t и т.п. Лучше всего завернуть этот синхронизирующий объект в "тонкий" класс.
5. Задумайся над семантикой функции getLog() - должна ли она возвращать копию текущего лога, как сейчас, или же ссылку на реальный лог (std::vector<LOGRECORD>& getLog() { return log; }), возможно, константную (const std::vector<LOGRECORD>& getLog() const { return log; })?
Осталось придумать, как правильно это реализовать!