2013-10-08 28 views
1

假設有一個用戶定義的類MyClass,它具有setter和getter函數。C++(CAS-like)同步用戶定義類型的getter和setter

class MyClass { 
    int m_value; 
    public: 
     void set(int value) 
     { m_value = value; } 

     int get() const 
     { return m_value;} 
}; 

而且還有一個功能increment()能夠由1增加對象的值,其可以在多個線程中被調用。

void increment(MyClass& myClass) 
{ 
    myClass.set(myClass.get() + 1); 
} 

什麼是使這個函數線程安全的最好方法是什麼?通過只使用鎖?有沒有辦法通過使用一些CAS類操作來實現它?

+0

這是不可能的,你需要原子能,他們甚至可能會比較慢,最好只保護類的數據與互斥。 – goji

+0

你當然可以添加myClass :: increment()方法。 –

回答

2

如果您使用C++ 11,你可以只使用std::atomic<int>提供原子loadstoreincrement這似乎是你需要的一切。

我懷疑你不需要原子,儘管在大多數情況下它們會比你的基本互斥更慢。

在做出決定之前,請參閱此其他question

+0

我不縮寫'std :: atomic '會工作,因爲我使用的是用戶定義的類型。感謝您的建議和鏈接。 – user571470

+0

所以真的,你唯一的解決方案就是用互斥體保護它。簡化決策;) – goji

+0

我也意味着在你的MyClass中內部使用std :: atomic 。如果這是你的用戶定義類型的含義。 – goji

-3

使用std ::互斥體,並享受

#include <mutex> 

    class MyClass 
    { 
     int m_value; 
     std::mutex mtx; 

     void set(int value) 
     { 
      mtx.lock(); 
      m_value = value; 
      mtx.unlock(); 
     } 

     int get() const 
     { 
      return m_value; 
     } 
    } 
+0

這不起作用。 'increment()'仍然不是線程安全的。 – user571470

+0

這是壞了。 – goji

+0

increment()不需要線程安全,因爲MyClass.set函數是線程安全的。 – Ronaldinho