message: Make Group::get_table() thread-safe with respect to
  concurrent calls to get_table().
  This is a fallback implementation based on a Mutex. If this use of locks
  turns out to be too costly, we'll have to make a smarter implementation.
diff: @@ -46,22 +46,6 @@ class TransactLogParser;
  /// A group is a collection of named tables.
  ///
  -/// Tables occur in the group in an unspecified order, but an order that
  -/// generally remains fixed. The order is guaranteed to remain fixed between two
  -/// points in time if no tables are added to, or removed from the group during
  -/// that time. When tables are added to, or removed from the group, the order
  -/// may change arbitrarily.
  -///
  -/// If `table` is a table accessor attached to a group-level table, and `group`
  -/// is a group accessor attached to the group, then the following is guaranteed,
  -/// even after a change in the table order:
  -///
  -/// \code{.cpp}
  -///
  -/// table == group.get_table(table.get_index_in_group())
  -///
  -/// \endcode
  -///
  class Group : public ArrayParent {
  public:
  /// Construct a free-standing group. This group instance will be
  @@ -583,6 +567,7 @@ private:
  typedef std::vector<Table*> table_accessors;
  mutable table_accessors m_table_accessors;
  + mutable std::mutex m_accessor_mutex;
  mutable int m_num_tables = 0;
  bool m_attached = false;
  const bool m_is_shared;
  @@ -903,6 +888,7 @@ inline TableRef Group::get_table(TableKey key)
  if (!is_attached())
  throw LogicError(LogicError::detached_accessor);
  DescMatcher desc_matcher = nullptr; // Do not check descriptor
  + std::lock_guard<std::mutex> lock(m_accessor_mutex);
  auto ndx = key2ndx_checked(key);
  Table* table = do_get_table(ndx, desc_matcher); // Throws
  return TableRef(table);
  @@ -913,6 +899,7 @@ inline ConstTableRef Group::get_table(TableKey key) const
  if (!is_attached())
  throw LogicError(LogicError::detached_accessor);
  DescMatcher desc_matcher = nullptr; // Do not check descriptor
  + std::lock_guard<std::mutex> lock(m_accessor_mutex);
  auto ndx = key2ndx_checked(key);
  const Table* table = do_get_table(ndx, desc_matcher); // Throws
  return ConstTableRef(table);
  @@ -923,6 +910,7 @@ inline TableRef Group::get_table(StringData name)
  if (!is_attached())
  throw LogicError(LogicError::detached_accessor);
  DescMatcher desc_matcher = nullptr; // Do not check descriptor
  + std::lock_guard<std::mutex> lock(m_accessor_mutex);
  Table* table = do_get_table(name, desc_matcher); // Throws
  return TableRef(table);
  }
  @@ -932,6 +920,7 @@ inline ConstTableRef Group::get_table(StringData name) const
  if (!is_attached())
  throw LogicError(LogicError::detached_accessor);
  DescMatcher desc_matcher = nullptr; // Do not check descriptor
  + std::lock_guard<std::mutex> lock(m_accessor_mutex);
  const Table* table = do_get_table(name, desc_matcher); // Throws
  return ConstTableRef(table);
  }
  