|
new и scmRTOS, Можно ли прерывать операцию new?! |
|
|
|
Dec 8 2008, 10:11
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 31-10-07
Пользователь №: 31 901

|
Делаю проект с использованием оси и с динамическим созданием объектов. Причем, создание и удаление объектов производяться в различных по приоритету (разумеется) процессах. Программа работает несколько минут, потом виснет (включая айдл процесс, тикает только системник). Наибольший адрес объекта, созданного когда-либо в рантайме, вылетает далеко за пределы кучи. Все сводится к тому, что проблема в создании обекта в одном из процессов. Так вот вопрос, можно ли безопасно создавать объекты в разных процессах, не опасаясь, что процедура "new" будет прервана высшестоящим процессом, в котором тоже запустится new, c вытекающим сбоем в работе динамической памяти??
|
|
|
|
|
 |
Ответов
|
Dec 8 2008, 12:22
|
Участник

Группа: Участник
Сообщений: 36
Регистрация: 31-10-07
Пользователь №: 31 901

|
Цитата(Сергей Борщ @ Dec 8 2008, 14:15)  Нет, нельзя. Переопределите глобальные operator new() и operator delete() - обрамите в нем malloc() и free() глобальным TMutex. Опс, а как там выделить эти malloc и free? Если не сложно, можно небольшой примерчик?
|
|
|
|
|
Dec 8 2008, 13:09
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Colobox @ Dec 8 2008, 14:22)  Если не сложно, можно небольшой примерчик? Примерно так: Код #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. Мне было удобнее так. Поправьте, как вам удобнее.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
Colobox new и scmRTOS Dec 8 2008, 10:11   Colobox Цитата(Сергей Борщ @ Dec 8 2008, 16:09) К... Dec 8 2008, 13:27    IgorKossak Цитата(Colobox @ Dec 8 2008, 15:27) А где... Dec 8 2008, 16:14     Colobox Цитата(IgorKossak @ Dec 8 2008, 19:14) Ко... Dec 8 2008, 17:26      Сергей Борщ Цитата(Colobox @ Dec 8 2008, 19:26) Нет-н... Dec 8 2008, 22:23 Colobox Спасибо за обстоятельные ответы. Заработало :-) Мо... Dec 9 2008, 12:59 IgorKossak Цитата(Colobox @ Dec 9 2008, 14:59) ...Мо... Dec 9 2008, 14:44
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|