可变线程与非常量方法

时间:2015-12-31 14:56:01

标签: c++ multithreading stl

我有一个类,我想在一个线程中调用一个方法。

我的方法不修改类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;
};

1 个答案:

答案 0 :(得分:2)

  

我的方法没有修改类属性,所以我希望它们是const,但它们实例化一个线程,所以它们不能。

但是你的方法修改类属性。你的std :: thread是一个类属性,一旦你的任何方法被调用,该属性将改变(开始运行),继续即使在方法退出后也改变状态。

  

将std :: thread变为可变,删除因为线程的const,编辑:或使用分离的线程之间的最佳选择是什么?

在这种情况下,我建议从方法签名中删除const。 Const只是混淆了界面,可能会让用户误以为它是线程安全的。如果这些方法在线程执行时间内受到互斥保护和阻塞,那么你可以为mutable和const做一个更强大的参数,但考虑到你当前的实现,我不会这样做。

编辑:换句话说,想象一下你已经开始创建一个const类的ValidationSound个实例。对于这个类的用户来说,以一种创建许多线程的方式调用你的实例将非常容易,这些线程在不同的时间交错播放不同的声音。你是如何设想这个类的const实例表现的?当然,我并不认为它纯粹是在界面上。