我有一个类,我想在一个线程中调用一个方法。
我的方法不修改类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;
};
答案 0 :(得分:2)
我的方法没有修改类属性,所以我希望它们是const,但它们实例化一个线程,所以它们不能。
但是你的方法做修改类属性。你的std :: thread是一个类属性,一旦你的任何方法被调用,该属性将改变(开始运行),继续即使在方法退出后也改变状态。
将std :: thread变为可变,删除因为线程的const,编辑:或使用分离的线程之间的最佳选择是什么?
在这种情况下,我建议从方法签名中删除const。 Const只是混淆了界面,可能会让用户误以为它是线程安全的。如果这些方法在线程执行时间内受到互斥保护和阻塞,那么你可以为mutable和const做一个更强大的参数,但考虑到你当前的实现,我不会这样做。
编辑:换句话说,想象一下你已经开始创建一个const
类的ValidationSound
个实例。对于这个类的用户来说,以一种创建许多线程的方式调用你的实例将非常容易,这些线程在不同的时间交错播放不同的声音。你是如何设想这个类的const实例表现的?当然,我并不认为它纯粹是在界面上。