Я использую импульс, чтобы начать нить и функцию нити является функцией член моего класса так же, как это:Как проверить деструктор был вызван в потоке?
class MyClass {
public:
void ThreadFunc();
void StartThread() {
worker_thread_ = boost::shared_ptr<boost::thread>(
new boost::thread(boost::bind(&MyClass::ThreadFunc, this)));
}
};
я получить доступ к некоторым переменным-членам в ThreadFunc
:
while (!stop) {
Sleep(1000); // here will be some block operations
auto it = this->list.begin();
if (it != this->list.end())
...
}
I не может ждать вечно для возвращения потока, поэтому я таймаут:
stop = true;
worker_thread_->interrupt();
worker_thread_->timed_join(boost::posix_time::milliseconds(timeout_ms));
После тайм-аута, я буду удалять этот MyClass
пуанты р. Здесь будет проблема, ThreadFunc
не вернется, у нее будут шансы получить доступ к и ее переменным-членам. В моем случае, итератор будет недействительным, и it != this->list.end()
будет правдой, поэтому моя программа потерпит крах при использовании недействительного итератора.
Мой вопрос: как его избежать? Или как проверить, действителен ли this
или переменные-члены? Или я могу установить некоторые флаги, чтобы сообщить ThreadFunc
, что деструктор был вызван?
Зачем вам удаляться 'MyClass', если он все еще используется? Кажется, плохая конструкция. Если вам нужен поток, который по-прежнему будет полуприменим без 'MyClass', тогда он не должен быть членом.Вам понадобится синхронизация вокруг того, что может быть украдено из-под вас. Вероятно, лучше всего использовать атомный общий указатель MyClass. И иметь 'ThreadFunc' - свободную функцию, которая принимает ее как параметр. – vu1p3n0x
@ vu1p3n0x Да, я думаю, что это плохой дизайн, общий указатель кажется хорошим. – zzy
Возможно, вам необходимо синхронизировать доступ к данным, совместно используемым между потоками. –