Ho cercato modi per combinare un dato che sarà accessibile da più thread accanto al blocco fornito per la sicurezza del thread. Penso di essere arrivato a un punto in cui non penso sia possibile farlo mantenendo la costituttezza.Impossibile essere const-correct quando si combinano i dati e si blocca?
Prendere la seguente classe, ad esempio:
template <typename TType, typename TMutex>
class basic_lockable_type
{
public:
typedef TMutex lock_type;
public:
template <typename... TArgs>
explicit basic_lockable_type(TArgs&&... args)
: TType(std::forward<TArgs...>(args)...) {}
TType& data() { return data_; }
const TType& data() const { return data_; }
void lock() { mutex_.lock(); }
void unlock() { mutex_.unlock(); }
private:
TType data_;
mutable TMutex mutex_;
};
typedef basic_lockable_type<std::vector<int>, std::mutex> vector_with_lock;
In questo cerco di combinare i dati e di blocco, la marcatura mutex_
come mutable
. Purtroppo non è sufficiente perché lo vedo perché, se utilizzato, vector_with_lock
deve essere contrassegnato come mutable
per eseguire un'operazione di lettura da una funzione const
che non è completamente corretta (data_
deve essere mutable
da un const) .
void print_values() const
{
std::lock_guard<vector_with_lock> lock(values_);
for(const int val : values_)
{
std::cout << val << std::endl;
}
}
vector_with_lock values_;
Chiunque può vedere in ogni caso intorno a questo in modo tale che const correttezza viene mantenuta, mentre la combinazione di dati e bloccare? Inoltre, ho fatto qualche ipotesi errata qui?
Fare 'lock' e' unlock' const? (Inoltre, non dovrebbe essere 'std :: lock_guard'? Perché hai reso un nuovo lockable per se non hai intenzione di usarlo?) –
Aggiornato 'lock_guard' – Graeme
@ R.MartinhoFernandes Naturalmente, contrassegnando questi const consentirà una chiamata di istanza 'vector_with_lock' non mutabile' lock' e 'unlock', sì? – Graeme