オブジェクトへのスレッド セーフなアクセスにこのクラス ラッパーを使用できますか?また、望ましい動作は C++11 に準拠していますか?
弦への主なアクセント:
T* operator->() {
と
T& operator*() {
ここでは整数(int)に std::atomic<> を使用するのが最適であることはわかっていますが、このコードでは int の代わりに他のオブジェクトを使用できます。
バージョン 2.0 では、execute-around ポインター イディオムを使用します。
#include<thread>
#include<mutex>
#include<memory>
#include<iostream>
#include<vector>
template<typename T>
class safe_obj {
T obj;
mutable std::mutex mtx;
safe_obj(safe_obj<T> &) {}
safe_obj<T>& operator=(safe_obj<T> &) {}
class T_exclusive_lock {
std::unique_lock<std::mutex> xlock;
public:
T*const self;
T_exclusive_lock(T * const s, std::mutex& _mtx)
:self(s), xlock(_mtx) {}
T* operator -> () const {return self;}
operator T&() {return *self;}
friend std::ostream& operator << (std::ostream &stream, T_exclusive_lock &obj) {
stream << obj;
return stream;
}
};
public:
template<typename Types>
safe_obj(Types args) : obj(args )
{ }
T_exclusive_lock operator->() {
return T_exclusive_lock(&obj, mtx);
}
T_exclusive_lock* operator*() {
return &T_exclusive_lock(&obj, mtx);
}
};
int main() {
safe_obj<std::shared_ptr<int> > safe_int( std::make_shared<int>(10) );
auto lambda = [&safe_int]() {
std::cout << safe_int->use_count() << std::endl; // is that thread-safe?
std::cout << *safe_int << std::endl; // is that thread-safe?
std::cout << *safe_int->get() << std::endl; // is that thread-safe?
};
std::vector<std::thread> thr_grp;
for(size_t i = 0; i < 10; ++i) thr_grp.emplace_back(std::thread(lambda));
for(auto &i : thr_grp) i.join();
int b; std::cin >> b;
return 0;
}