2012-11-20 31 views
4

我在我的類中有一些私有變量(比如int a,int b,int c)。由於某些內部操作,我需要以線程安全的方式設置/獲取這些變量,所以我使用了一些包裝getter/setter並使用了範圍互斥鎖。關於公共變量訪問的線程安全性

void setA(int a) 
{ 
    unique_lock<mutex> lock(opMutex); 

    this->a = a; 
} 

void getA(int a) 
{ 
    unique_lock<mutex> lock(opMutex); 

    return a; 
} 

void setB(int b) 
{ 
    unique_lock<mutex> lock(opMutex); 

    this->b = b; 
} 

void setC(int c) 
{ 
    unique_lock<mutex> lock(opMutex); 

    this->c = c; 
} 

我的問題是:這是possbile避免getter/setter方法(公共變量),並保持線程安全的分配/讀了這些變量的操作?

回答

3

Boost有一個類似的圖書館,boost::atomic,但它尚未包含在標準AFAIK中。

4

如果你移動你的線程安全的同步代碼的getter setter方法外,並與樣板代碼鎖定互斥到處臃腫的代碼,是的,它可以不使用getter和setter方法,但它會真是適得其反

2

您可以使用std::atomic<int> a, b, c;

PS。呃,我沒有看到boost標籤,所以我認爲你在說C++ 11 ...

+0

有趣嗎,原子類型是否重定義了一個線程安全的運算符? –

+0

它只適用於基本類型嗎? –

+0

+1:不知道那種類型,很高興談論它 –

3

如果C++ 11是一個選項,請考慮使用std::atomic_store and std::atomic_loadatomic_int。然而,你可能仍然應該和getter/setter呆在一起,所以你關於如何管理數據的決定(例如,atomics和mutex之間的選擇)不會影響類用戶,即使這只是你:)

如果C++ 11不是一個選項,那麼您可以使用其中一個C++ 98兼容的原子操作實現。我已經使用了proposed boost atomic library很長一段時間,還有其他的實現漫遊在互聯網上。

+0

沒關係,但我必須使用普通的舊C++ 98標準 –

+0

有一些工作正在進行中Boost.Atomic http://git.chaoticmind.net/cgi-bin/cgit.cgi/boost.atomic/ – chill