Я не смог определить, откуда происходит странная авария, но факт, что это не происходит детерминистически, заставляет меня подозревать пронизывание.Может ли инициализация потока в конструкторе класса привести к сбою?
У меня есть что-то вроде этого:
class MyClass
{
MyClass() : mExit(false), mThread(&MyClass::ThreadMain,this)
{}
void ThreadMain()
{
unique_lock<mutex> lock(mMutex);
mCondition.wait(lock, [&] { return mExit; });
}
std::thread mThread;
std::mutex mMutex;
std::condition_variable mCondition;
bool mExit;
};
Очевидно, что это очень упрощенное, но я не знаю точно, где авария происходит еще, так что я хочу спросить, если эта настройка может вопросов вызывают? Какой порядок все инициализируется, например, есть ли возможность, чтобы ThreadMain
мог работать до того, как экземпляр класса полностью сконструирован, например?
Похоже на некоторые примеры, которые я видел в Интернете, но я не уверен, что это определенно безопасно или нет.
Я не осознавал инициализацию 'mutex' и' condition_variable' _needed_? Или вы говорите, что я должен сделать это явно, например. : 'MyClass(): mExit (false), mMutex(), mCondition(), mThread (& MyClass :: ThreadMain, this)' –
@ Mr.Boy Я бы никогда не использовал неинициализированную переменную, поэтому да, я бы по умолчанию инициализировал их в конструктор. – NathanOliver
@NathanOliver Не включая _objects_ в списке инициализации приведет к тому, что они будут _default initialized_. Включая их в список инициализаторов, передавая нулевые аргументы конструктору, объекты будут _value initialized_. – Snps