Colobox 0 8 декабря, 2008 Опубликовано 8 декабря, 2008 · Жалоба Делаю проект с использованием оси и с динамическим созданием объектов. Причем, создание и удаление объектов производяться в различных по приоритету (разумеется) процессах. Программа работает несколько минут, потом виснет (включая айдл процесс, тикает только системник). Наибольший адрес объекта, созданного когда-либо в рантайме, вылетает далеко за пределы кучи. Все сводится к тому, что проблема в создании обекта в одном из процессов. Так вот вопрос, можно ли безопасно создавать объекты в разных процессах, не опасаясь, что процедура "new" будет прервана высшестоящим процессом, в котором тоже запустится new, c вытекающим сбоем в работе динамической памяти?? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 8 декабря, 2008 Опубликовано 8 декабря, 2008 · Жалоба можно ли безопасно создавать объекты в разных процессах, не опасаясь, что процедура "new" будет прервана высшестоящим процессом,Нет, нельзя. Переопределите глобальные operator new() и operator delete() - обрамите в нем malloc() и free() глобальным TMutex. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Colobox 0 8 декабря, 2008 Опубликовано 8 декабря, 2008 · Жалоба Нет, нельзя. Переопределите глобальные operator new() и operator delete() - обрамите в нем malloc() и free() глобальным TMutex. Опс, а как там выделить эти malloc и free? Если не сложно, можно небольшой примерчик? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 8 декабря, 2008 Опубликовано 8 декабря, 2008 · Жалоба Если не сложно, можно небольшой примерчик?Примерно так:#include <stdint.h> #include <new> #include <scmRTOS.h> extern bool FreeMemory(); // Ищет память: сборка мусора. возвращает false если памяти не нашлось class heap_mutex_t { public: heap_mutex_t() { Mutex.Lock(); } ~heap_mutex_t() { Mutex.Unlock(); } private: static OS::TMutex Mutex; }; OS::TMutex heap_mutex_t::Mutex; void * operator new(size_t size) { for(;;) { void * Tmp; { heap_mutex_t Lock; Tmp = malloc(size); } if(Tmp) return Tmp; else // пытаемся найти память if(! FreeMemory() ) return 0; } } void * operator new (size_t size, const _STD nothrow_t& ) { return operator new(size); } void operator delete( void * pobject ) { heap_mutex_t Lock; free(pobject); } "настоящий" new не возвращает 0. Мне было удобнее так. Поправьте, как вам удобнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Colobox 0 8 декабря, 2008 Опубликовано 8 декабря, 2008 · Жалоба #include <stdint.h> #include <new> #include <scmRTOS.h> void * operator new(size_t size) { for(;;) { void * Tmp; { heap_mutex_t Lock; Tmp = malloc(size); } if(Tmp) return Tmp; else // пытаемся найти память if(! FreeMemory() ) return 0; } } void operator delete( void * pobject ) { heap_mutex_t Lock; free(pobject); } А где же в этих "новых" new и delete вызовы конструктора и деструктора объекта?! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 8 декабря, 2008 Опубликовано 8 декабря, 2008 · Жалоба А где же в этих "новых" new и delete вызовы конструктора и деструктора объекта?! Конструктор вызывается при создании обьекта Lock, а деструктор - при уничтожении этого обьекта, когда он покидает область видимости, в первом случае это блок, во втором - вся функция. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Colobox 0 8 декабря, 2008 Опубликовано 8 декабря, 2008 · Жалоба Конструктор вызывается при создании обьекта Lock, а деструктор - при уничтожении этого обьекта, когда он покидает область видимости, в первом случае это блок, во втором - вся функция. Нет-нет, я про тот объект, который создается собственно оператором new. Ведь new и malloc- это не совсем идентичные функции,- new выделяет память под объект заданного типа и запускает конструктор этого объекта- и вот, память выделили, а конструктор?! Чего то недопонимаю? extern bool FreeMemory(); // Ищет память: сборка мусора. А сборка мусора -это , по-сути, дефрагментация кучи, что б дырок не было? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 8 декабря, 2008 Опубликовано 8 декабря, 2008 · Жалоба Нет-нет, я про тот объект, который создается собственно оператором new.А запуск конструктора вставляется компилятором после вызова operator new() после проверки результата на ноль. Такие вопросы очень легко разрешаются чтением листинга. А сборка мусора -это , по-сути, дефрагментация кучи, что б дырок не было?А это как вам угодно. У меня в системе есть буфер сообщений. Если памяти не хватает - FreeMemory() удаляет самые старые сообщения. Сообщения теряются, но система продолжает работать. При нормальной работе эта функция вызываться не должна. Можно делать сборку мусора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Colobox 0 9 декабря, 2008 Опубликовано 9 декабря, 2008 · Жалоба Спасибо за обстоятельные ответы. Заработало :-) Может, включить эти измененные new и delete в дистрибутив оси? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 9 декабря, 2008 Опубликовано 9 декабря, 2008 · Жалоба ...Может, включить эти измененные new и delete в дистрибутив оси? В некоторых случаях функции malloc() и free() пользователи сами переписывают под свои нужды. Универсального решения не получится. Не думаю, что стоит включать частное решение в дистрибутив, разве что только как пример конкретного решения в примерах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться