Код: Выделить всё
#include
#include
std::lock_guard lock1(std::mutex& m)
{
return std::lock_guard{ m };
}
std::shared_ptr lock2(std::mutex& m)
{
return std::make_shared(m);
}
int main()
{
std::mutex m1;
auto lg1 = lock1(m1);
std::mutex m2;
auto lg2 = lock2(m2);
return 0;
}
< /code>
Я делаю что -то не так, или MSVC виноват? Могу ли я обойти его без использования shared_ptr, например, используя std :: move Код: Выделить всё
#include
#include
#include
#include
#include
template
class ThreadSafePtr
{
std::shared_ptr ptr;
std::shared_ptr mutex;
public:
template
ThreadSafePtr(Args&&... args) : ptr{ std::make_shared(std::forward(args)...) }, mutex{ std::make_shared() } {}
ThreadSafePtr(ThreadSafePtr& orig) = default;
ThreadSafePtr& operator= (ThreadSafePtr& orig) = default;
class Lock
{
friend class ThreadSafePtr;
T& ref;
std::lock_guard lock;
Lock(ThreadSafePtr* tsptr) : ref{ *tsptr->ptr }, lock{ *tsptr->mutex } {}
public:
T& get() const { return ref; }
};
//Lock lock() { return Lock{ this }; }
std::shared_ptr lock()
{
return std::shared_ptr{ new Lock{ this } };
}
};
int main()
{
ThreadSafePtr map;
std::thread([map]() mutable -> void { map.lock()->get()[1] = 2; }).detach();
std::thread([map]() mutable -> void { map.lock()->get()[3] = 4; }).detach();
return 0;
}
Подробнее здесь: https://stackoverflow.com/questions/795 ... -around-it
Мобильная версия