Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> delete this ? oO 
V
    Опции темы
boostcoder
Дата 17.12.2010, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



всем привет.
задача немного нестандартная..
и так.. есть некоторый тип, который в конструкторе стартует асинхронную операцию. по завершении асинхронной операции, объект этого типа нужно удалить.

объект:
Код

struct reader: boost::noncopyable {
   reader() {
      // init
      async_operation();
   }
   ~reader() {
      // clean
   }
   // вызывается в момент завершения асинхронной операции
   void async_operation_finished() {
      delete this; // <<<<<
   }
};

так вот.. время жизни таких объектов не более 50мс.
в архитектуре приложения, использовать такие объекты на протяжении всего времени работы приложения, очень неудобно, из-за большого кол-ва таких объектов и связанных с этим блокировок синхронизаций.
полагаю, создавать эти объекты налету, по необходимости, будет сильно удобней.
в таком случае, время жизни таких объектов нельзя ограничивать блоком кода. поэтому придется создавать их в куче.

проблема: как удалять их? в смарт поинтеры пихать нельзя, иначе получим то же ограничение блоком.
вопрос: я подумал.. а что если, объекты по завершению асинхронной операции будут сами себя удалять? никогда такого не делал, потому не в курсе, насколько это допустимо.

спасибо.

Добавлено через 2 минуты
сами объекты еще не написал. потому не могу проверить. но ответ на этот вопрос нужен уже сейчас, чтоб потом не переписывать логику приложения.
PM WWW   Вверх
azesmcar
  Дата 17.12.2010, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(boostcoder @  17.12.2010,  07:44 Найти цитируемый пост)
никогда такого не делал, потому не в курсе, насколько это допустимо.

теоретически - допустимо, но связано со множеством проблем. Во первых если объект не был создан по средствам оператора new, будет нехорошо. Во вторых нужно быть уверенным, что никто после этого не попытается обратиться к объекту.

Цитата(boostcoder @  17.12.2010,  07:44 Найти цитируемый пост)
и так.. есть некоторый тип, который в конструкторе стартует асинхронную операцию. по завершении асинхронной операции, объект этого типа нужно удалить.

А зачем для этого нужен класс?
Почему бы этим не заняться какому-то отдельному классу типа thread pool или std::async.
Код

std::async(oper1);
std::async(oper2);
...

и ничего удалять не надо.

Это сообщение отредактировал(а) azesmcar - 17.12.2010, 07:52
PM   Вверх
boostcoder
Дата 17.12.2010, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(azesmcar @  17.12.2010,  07:50 Найти цитируемый пост)
Во первых если объект не был создан по средствам оператора new, будет нехорошо.

это невозможно.... а можно каким-либо образом сделать проверку на стеке или в куче был создан объект?

Цитата(azesmcar @  17.12.2010,  07:50 Найти цитируемый пост)
Во вторых нужно быть уверенным, что никто после этого не попытается обратиться к объекту.

к нему никто не обращается. только сам объект вызывает полученный в конструктор функциональный объект.

Цитата(azesmcar @  17.12.2010,  07:50 Найти цитируемый пост)
А зачем для этого нужен класс?

у объекта есть собственные данные..

std::async() поддерживает move semantic?

Добавлено через 4 минуты и 46 секунд
т.е. по идее, это:
Код

std::async(reader(...));

должно решить проблему..
PM WWW   Вверх
azesmcar
Дата 17.12.2010, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(boostcoder @  17.12.2010,  07:56 Найти цитируемый пост)
это невозможно

каким образом обеспечивается невозможность?

Цитата(boostcoder @  17.12.2010,  07:56 Найти цитируемый пост)
 а можно каким-либо образом сделать проверку на стеке или в куче был создан объект?

 smile 

Цитата(boostcoder @  17.12.2010,  07:56 Найти цитируемый пост)
у объекта есть собственные данные..

функтор+std::async

Цитата(boostcoder @  17.12.2010,  07:56 Найти цитируемый пост)
std::async() поддерживает move semantic? 

В каком смысле? move чего?
Код

struct async_operation
{
    void operator()()
    {
        /* TODO */
    }
    int x;
    int y;
};

int main()
{
    std::async(async_operation());
}


PM   Вверх
boostcoder
Дата 17.12.2010, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(azesmcar @  17.12.2010,  08:01 Найти цитируемый пост)
каким образом обеспечивается невозможность?

мной smile 

Цитата(azesmcar @  17.12.2010,  08:01 Найти цитируемый пост)
функтор+std::async

угу

PM WWW   Вверх
azesmcar
Дата 17.12.2010, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Если состояние потока вообще не интересует, то можно так
Код

std::thread(async_operation()).detach();


PM   Вверх
boostcoder
Дата 17.12.2010, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(azesmcar @  17.12.2010,  08:53 Найти цитируемый пост)
Если состояние потока вообще не интересует, то можно так

 smile 
протупил.
вопрос закрыт.

PM WWW   Вверх
mes
Дата 17.12.2010, 09:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  17.12.2010,  06:56 Найти цитируемый пост)
а можно каким-либо образом сделать проверку на стеке или в куче был создан объект?

можно спрятать конструктор (и добавить креаторную функцию ) или деструктор (для делете this)..


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0832 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.