c – 初始化类构造函数中的线程会导致崩溃吗?
发布时间:2020-12-16 10:12:06 所属栏目:百科 来源:网络整理
导读:我无法确定一个奇怪的崩溃来自哪里,但它没有确定性地发生这一事实让我怀疑是线程. 我有这样的事情: class MyClass{ MyClass() : mExit(false),mThread(MyClass::ThreadMain,this) {} void ThreadMain() { unique_lockmutex lock(mMutex); mCondition.wait(l
我无法确定一个奇怪的崩溃来自哪里,但它没有确定性地发生这一事实让我怀疑是线程.
我有这样的事情: 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是否可以运行? 它看起来像我在网上看到的一些例子,但我不确定它是否绝对安全. 解决方法
我看到的唯一问题是类成员按照它们在类中声明的顺序进行初始化.由于mThread位于所有其他类成员之前,因此线程可能在初始化之前使用它们.
要解决此问题,您可以重新安排班级成员,但我不喜欢这种方法.如果其他人出现并更改了订单,则可能会破坏代码.您应该能够让线程获得默认初始化,然后在构造函数体中启动线程,因为此时所有类成员都已初始化. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |