在許多情況下,許多成員函式可以指定為“const”——它們不修改類的任何資料成員......幾乎:它們確實鎖定/解鎖類互斥鎖。在這種情況下,指定互斥鎖“可變”是一個好習慣嗎? ...否則,將無法指定 get_a()、get_b()、get_c()、get_d() 'const'。
——
一個簡單的例子。假設 'example' 是一個執行緒安全類,并且 m_mutex 保護其共享資源,get_a()、get_b()、get_c()、get_d() 不會修改:
#include <mutex>
class example
{
public:
size_t get_a(void) const {
std::lock_guard lck(m_mutex);
return m_str.length() a;
};
size_t get_b(void) const {
std::lock_guard lck(m_mutex);
return m_str.length() * 2 a b;
};
size_t get_c(void) const {
std::lock_guard lck(m_mutex);
return m_str.length() * 4 a b;
};
size_t get_d(void) const {
std::lock_guard lck(m_mutex);
return m_str.length() * 8 a;
};
void modify_something() {
std::lock_guard lck(m_mutex);
if (m_str.length() < 1000) {
m_str.append(".");
a ;
b ;
}
};
protected:
mutable std::mutex m_mutex;
std::string m_str;
int a = 0, b = 0;
};
uj5u.com熱心網友回復:
這不僅是正確的,也是標準做法。成員mutex被描述為“不可觀察的非常量”,這意味著它對“用戶”觀察者表現為常量。
Herb Sutter 推廣了M&M 規則:
對于成員變數,可變和互斥(或原子)一起使用。
與您的問題相關的規則部分指出:
對于成員變數,mutex(或類似的同步型別)意味著 mutable:本身屬于同步型別的成員變數,例如 mutex 或條件變數,自然希望是可變的,因為您會希望在
std::lock_guard<mutex>并發const成員函式中的非常量方式(例如,采用 a )。
如果您想更深入地研究,鏈接的文章有許多代碼示例和進一步的闡述。
uj5u.com熱心網友回復:
是的,正是出于這個原因,使同步物件可變是很常見的。話雖如此,將這些同步物件保存在類中也相對少見,因為“確保安全并發”很少是類本身所涉及的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/396642.html
上一篇:檢查二維向量的每個元素中的匹配項
