изменяемое ключевое слово и безопасность потока - PullRequest
3 голосов
/ 20 января 2011

У меня есть абстрактный базовый класс

class Map {
  public:
    virtual Value get(Key const &) const;
};

класс базы данных из внешней библиотеки

class Database {
  public:
    // logically const and thread-safe
    Value get(Key const &key);
};

, и я начал с реализации, подобной

class PersistentMap : public Map {
    Database db;

  public:
    Value get(Key const &key) const
    { return const_cast<Database &>(db).get(key); }
};

Поскольку число const_cast s вышло за пределы, я избавился от них, добавив спецификатор mutable к PersistentMap::db (и комментарий, чтобы напомнить себе о его уродстве).

  1. Былмоя первая попытка с const_cast потоко-безопасным?
  2. Мой новый подход поточно-ориентирован, или db также должен быть отмечен volatile?

1 Ответ

1 голос
/ 21 января 2011

Это полностью зависит от того, является ли Database :: get поточно-ориентированным или нет. Если он содержит блокировки для предотвращения одновременного доступа или иным образом безопасен для одновременного доступа, то ваш код подходит для const_cast или mutable. Использование volatile совершенно неактуально.

...