Lo so, lo so, il titolo del mio messaggio può sembrare provocatorio, dal momento che boost :: mutex intenzionalmente non esporre blocco/sblocco (per evitare la morte serrature).boost :: mutex/Come verificare se un mutex è bloccato
Tuttavia la documentazione di boost è piuttosto corta su questi aspetti (per non dire altro), quindi mi chiedo se qualcuno può aiutarmi nel seguente caso d'uso.
Supponiamo di avere una classe Foo, che ha:
- un distruttore che richiede un po 'di tempo per completare
- un metodo che viene chiamato da un thread distinti, ma non dovrebbe essere chiamato durante la distruzione
class Foo
{
public:
virtual ~Foo()
{
//Time consuming operations here
}
//Method called by a timer belonging to a distinct class
void OnTimer()
{
//Other time consuming stuff. Should not be called during destruction !
}
};
ho cercato (senza successo) per implementare una versione basata su boost :: mutex
//boost::mutex implementation
class Foo
{
public:
Foo()
{
}
virtual ~Foo()
{
{
boost::mutex::scoped_lock lock(mDisposingMutex);
//Time consuming operations here
}
}
//Method called by a timer belonging to a distinct class
void OnTimer()
{
{
//Imaginary code here: mutex::locked() method is private !!!
if (! mDisposingMutex.locked())
return;
}
//Other time consuming stuff. Should not be called during destruction !
}
private:
boost::mutex mDisposingMutex;
};
Am I del tutto sbagliato? Qualcuno può dirmi come dovrebbe essere fatto con boost :: mutex?
Grazie!
Perché è il vostro oggetto che viene distrutto mentre un altro thread ha ancora un puntatore ad esso? –
Non rispondendo direttamente alla domanda, è possibile annullare la registrazione provocando la chiamata 'OnTimer()' come primo passo nel distruttore? Certo, una chiamata può ancora arrivare in modo asincrono "allo stesso tempo", ma non è ancora chiaro perché questo oggetto sottoposto a distruzione sia ancora un bersaglio per questi callback. – seh
@Anon: d'accordo, questo è un odore di codice. Comunque sono ancora interessato alla risposta. @Seh: il tuo commento è basato sullo stesso codice odore. Tuttavia, non posso cancellarlo direttamente senza interrompere l'incapsulamento. –