2016-11-17 82 views
0

是否有线程安全类成员变量的C++语言功能?快速搜索或两个都没有透露,但我认为这很简单,并提出了这个解决方案。是否有线程安全类变量的C++标准?

template <class T> 
class ThreadSafeVar 
{ 
private: 
    T safeVar; 
    std::mutex accessMutex; 

public: 
    ThreadSafeVar(T initialValue) { safeVar = initialValue; } 
    ThreadSafeVar<T>& operator=(const T &source) { set(source); return *this; } 
    ThreadSafeVar<T>& operator=(ThreadSafeVar<T> &source) { set(source.get()); return *this; }; 

    void set(T newValue) 
    { 
     std::lock_guard<std::mutex> lock(accessMutex); 
     safeVar = newValue; 
    }; 

    T const get(void) 
    { 
     std::lock_guard<std::mutex> lock(accessMutex); 
     return safeVar; 
    }; 
}; 

此解决方案是否有任何问题(可能的死锁等)? C++是否已经有了这样的方法?

+0

对于TriviallyCopyable类型,std :: atomic 提供了set,​​get和exchange方法。 –

回答

0

你的代码没有问题。对于trivially可复制类型有std :: atomic。

0

请参阅std::atomicstd::memory_order

以下是一个示例,您可以使用g++ -std=c++ atomic_example.cpp来尝试。

#include <atomic> 
#include <iostream> 
#include <thread> 

class ThreadSafeVar { 
public: 
    ThreadSafeVar() { var_.store(0, std::memory_order::memory_order_relaxed); } 
    ~ThreadSafeVar() {} 

    void Add() { var_.fetch_add(1, std::memory_order::memory_order_acquire); } 

    long Get() { return var_.load(std::memory_order_acquire); } 

private: 
    std::atomic<long> var_; 
}; 

void Foo(ThreadSafeVar& var) { 
    long i = 0; 
    while (i++ < (1l << 20)) { 
    var.Add(); 
    } 
} 

int main(int argc, char* argv[]) { 
    ThreadSafeVar var; 
    std::thread thr1 = std::thread(Foo, std::ref(var)); 
    std::thread thr2 = std::thread(Foo, std::ref(var)); 
    thr1.join(); 
    thr2.join(); 
    std::cout << "var = " << var.Get() << "\n"; 
    return 0; 
}