线程安全的类成员变量是否有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 :(得分:0)
您的代码没有任何问题。对于简单的可复制类型,有std :: atomic。
答案 1 :(得分:0)
请参阅std::atomic和std::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;
}