У меня есть абстрактный базовый классизменяемые ключевое слово и потокобезопасность
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
(и комментарий, напоминающий о его уродстве).
- Была моя первая попытка с
const_cast
thread-безопасна? - Является ли мой новый подход поточно-безопасным или должен
db
также обозначитьvolatile
?
'// логически const и потокобезопасный' Да? Что с этим связано с безопасностью потоков? 'const_cast',' const' и 'mutable' - это вещи из системы * type *, которая не имеет ничего общего с безопасностью потоков. Поэтому вопрос один не имеет никакого смысла. Кроме того, 'volatile' бесполезен для многопоточности, это [распространенное заблуждение] (http://stackoverflow.com/questions/2484980/why-is-volatile-not-considered-useful-in-multithreaded-c-or -с-программирование). – GManNickG
@GMan: Я понял, что компилятор может сделать оптимизацию, основанную на 'const' -ness моего класса, которая нарушит безопасность потоков. –
@larsmans: Оптимизация не может разрушить потокобезопасный код. И 'const', опять же, просто означает, что значение, обозначенное переменной, не может быть изменено, вы можете использовать его, сделать его« изменчивым »и т. Д. Ничто из этого не влияет на его безопасность потока, * время выполнения * Значение. – GManNickG