![](/img/trans.png)
[英]Is modifying non-mutable member of non-const object in const method Undefined Behaviour?
[英]mutable thread vs non-const method
我有一个类,我想在一个线程中调用一个方法。
我的方法不修改类attributs所以我希望它们是const,但是它们实例化一个线程,所以它们不能。
放入std :: thread可变,删除const因为线程, 编辑:或使用分离线程之间的最佳选择是什么?
class ValidationSound
{
public:
[... CTOR DTOR ...]
void emitSuccessSoundAsync() const
{
if(m_thread.joinable())
{
m_thread.join();
}
m_thread = std::thread(&ValidationSound::emitSound, this, std::cref(m_bipsParameters.first));
};
void emitFailureSoundAsync() const
{
if(m_thread.joinable())
{
m_thread.join();
}
m_thread = std::thread(&ValidationSound::emitSound, this, std::cref(m_bipsParameters.second));
};
void emitSound(const BipParameters& bipParam) const
{
//BIP BIP THE BUZZER
};
private:
std::pair<BipParameters, BipParameters> m_bipsParameters;
mutable std::thread m_thread;
};
我的方法不修改类attributs所以我希望它们是const,但是它们实例化一个线程,所以它们不能。
但是您的方法会修改类属性。 你的std :: thread是一个类属性,一旦你的任何方法被调用,该属性将改变(开始运行)并继续改变状态,即使在方法退出之后。
放入std :: thread可变,删除const因为线程,编辑:或使用分离线程之间的最佳选择是什么?
在这种情况下,我建议从方法签名中删除const。 Const只是混淆了界面,可能会让用户误以为它是线程安全的。 如果这些方法在线程执行时间内受到互斥保护和阻塞,那么你可以为mutable和const做一个更强的参数,但考虑到你当前的实现,我不会。
编辑:换句话说,想象一下你已经完成并创建了ValidationSound
类的单个const
实例。 对于这个类的用户来说,以一种创建许多线程的方式调用你的实例将非常容易,这些线程在不同的时间交错播放不同的声音。 那你是如何设想这个类的const实例表现的? 这当然不是我想象它纯粹在界面上的看法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.