2014-02-12 2 views
0

рассматривает следующий классудаление не готовый объект во время выполнения CPP

class test{ 
private: long long id; 
//some field.... 
public: test(){}; 
void do_something(){ 
//some huge operations.... 
} 
void do_something_else(void* arg){ 
//yet another huge work load..... 
} 
} 
/////////////////////////// 
void* _thread(void* _ins){ 
test* ins=(test*)_ins; 
//some work 
if(<<some condition>>){delete ins;}//not thread safe, std::auto_ptr doesn't help anymore 
} 
/////////////////////////// 
int main(){ 
test *ins=new test(); 
//pass the ins to 10 thread. 
} 

считает, что существует 10 нитей, используя общий объект, когда-либо один из нити удалить объект, выход из программы. Вопросы: Как я могу получить любую ошибку/исключение во время выполнения, когда объект будет удален? try-catch не помогло. любое решение ?!
Есть ли какой-нибудь потокобезопасный и консистенционный способ подсчета текущей темы, используя этот объект?
есть ли какое-либо событие-решение для запуска события, когда объект готов к очистке?

благодарит заранее.

+1

Вы можете использовать общие указатели C++ 11 (у них есть счетчик ссылок для общих экземпляров): http: // ru.cppreference.com/w/cpp/memory/shared_ptr Не забудьте синхронизировать проверку этого количества в ваших потоках (например, использовать мьютексы или что-то подобное) –

+0

Не относится к вашей проблеме, но не имеет глобальных имен с ведущие подчеркивания, поскольку они зарезервированы спецификацией. –

+0

@ DavidKernin благодарит чувака, ни 'std :: shared_ptr' не помогает. потому что, как вы упомянули, я должен считать поток безопасным. но это небезопасно. потому что два потока будут изменять значение за раз (одно увеличение/одно уменьшение), и если первый идет первым, он удалит объект, который вызывает ошибку для второго потока. –

ответ

1

C++ 11's shared_ptrs использование атомных приращений/декретов значения счетчика ссылок.

Стандарт гарантирует, что только один поток вызовет оператор удаления на общем объекте.

Что нужно сделать, так это то, что ваш критический раздел синхронизирован, то есть: общий объект не освобожден, если поток все еще использует его. Вы можете использовать для этого std::mutex (семафор может быть реализован с помощью мьютекса и переменной условия, например https://stackoverflow.com/a/4793662/1938163)

+0

Спасибо, чувак, ты КОРОЛЬ. –

Смежные вопросы