[英]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.