2011-01-20 3 views
3

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

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 thread-безопасна?
  2. Является ли мой новый подход поточно-безопасным или должен db также обозначить volatile?
+4

'// логически const и потокобезопасный' Да? Что с этим связано с безопасностью потоков? 'const_cast',' const' и 'mutable' - это вещи из системы * type *, которая не имеет ничего общего с безопасностью потоков. Поэтому вопрос один не имеет никакого смысла. Кроме того, 'volatile' бесполезен для многопоточности, это [распространенное заблуждение] (http://stackoverflow.com/questions/2484980/why-is-volatile-not-considered-useful-in-multithreaded-c-or -с-программирование). – GManNickG

+0

@GMan: Я понял, что компилятор может сделать оптимизацию, основанную на 'const' -ness моего класса, которая нарушит безопасность потоков. –

+0

@larsmans: Оптимизация не может разрушить потокобезопасный код. И 'const', опять же, просто означает, что значение, обозначенное переменной, не может быть изменено, вы можете использовать его, сделать его« изменчивым »и т. Д. Ничто из этого не влияет на его безопасность потока, * время выполнения * Значение. – GManNickG

ответ

1

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

Смежные вопросы