Với std::tuple
,là truy cập vào một tuple của các bộ của con trỏ và một mutexes thread-safe
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;
Và chức năng,
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)
}
Theo this câu hỏi về SO truy cập vào một std::tuple
không phải là vốn có chủ đề an toàn, nhưng trong trường hợp mã ví dụ thì sao? Có thể cho những điều không xác định/kỳ lạ xảy ra không?
Đây là giả định FooN
& BarN
chỉ được truy cập sau khi khóa.
std :: không sửa đổi trạng thái của 'tuple', tôi không thể đảm bảo nhưng tôi chắc chắn nó sẽ hoạt động như thể bạn truy cập trực tiếp đối tượng bên dưới, có nghĩa là nếu đối tượng bên dưới là thread an toàn, hoạt động sẽ được (thực tế) thread an toàn. – Gizmo