Si consideri il seguente C++ funzione membro:Sincronizzazione accesso a un valore di ritorno
size_t size() const
{
boost::lock_guard<boost::mutex> lock(m_mutex);
return m_size;
}
L'intento qui non è per sincronizzare l'accesso alla variabile membro privato m_size
, ma solo per assicurarsi che il chiamante riceve un valore valido per m_size. L'obiettivo è impedire che la funzione restituisca m_size
nello stesso momento in cui qualche altro thread sta modificando m_size
.
Ma c'è qualche potenziale condizione di competizione nel chiamare questa funzione? Non sono sicuro che il blocco dello stile RAII qui sia adeguato per proteggersi da una condizione di competizione. Supponiamo che il distruttore del lucchetto sia chiamato prima del il valore di ritorno della funzione sia inserito nello stack?
Devo fare qualcosa di simile al seguente per garantire la sicurezza del filo?
size_t size() const
{
size_t ret;
{
boost::lock_guard<boost::mutex> lock(m_mutex);
ret = m_size;
}
return ret;
}
Non credo che la tua serratura faccia davvero qualcosa. Finché 'm_size' può essere letto nella sua interezza in una singola operazione atomica, otterrai un valore valido. –
Questo non è garantito in realtà. Tuttavia l'uso di 'std :: atomic' che viene fornito con C++ 0x garantirebbe questo senza il blocco. –
@Mike: anche i lucchetti sono una barriera di memoria. Tale è necessario per sincronizzare le cache del processore ecc. – sbi