是否有针对线程安全的类变量的C ++标准?

时间:2016-11-17 01:09:16

标签: c++ multithreading templates thread-safety

线程安全的类成员变量是否有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 ++是否已经有了这样做的方法?

2 个答案:

答案 0 :(得分:0)

您的代码没有任何问题。对于简单的可复制类型,有std :: atomic。

答案 1 :(得分: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;
}