Учитывая std::tuple
,
using Tuple1 = std::tuple<Foo1*, Bar1*, std::shared_ptr<std::mutex>>;
using Tuple2 = std::tuple<Foo2*, Bar2*, std::shared_ptr<std::mutex>>;
std::tuple<Tuple1, Tuple2> tuple;
И функция,
void baz()
{
auto tup = std::get<0>(tuple);
std::lock_guard<std::mutex> lk(*std::get<2>(tup));
// Do something with std::get<0>(tup) and std::get<1>(tup)
}
В соответствии с этот вопрос о доступе SO к std::tuple
по своей сути не потокобезопасен, но как насчет примера кода ? Возможны ли неопределенные/странные вещи?
Это предполагает, что FooN
и BarN
доступны только после блокировки.
tuple
, я не могу дать вам гарантию, но я почти уверен, что он будет работать так, как если бы вы обращались к базовому объекту напрямую, что означает, что если базовый объект является потокобезопасным, операция будет (практически) потокобезопасной. - person Gizmo   schedule 13.06.2017