Ho una classe ConcurrentQueue
che si basa su un utente fornito contenitore con un costruttore come questo ...Come posso bloccare un mutex in un elenco di inizializzatore?
ConcurrentQueue(const ConcurrentQueue& other) : m_Queue(other.m_Queue) {}
Ma, ho bisogno di bloccare other
s' mutex mentre è in corso la copia.
Opzione 1:
così ho potuto non usare il costruttore di copia a tutti, e fare ...
ConcurrentQueue(const ConcurrentQueue& other) : m_Queue(other.m_Queue)
{
std::lock_guard<std::mutex> lock(other.m_Mutex);
m_Queue = other.m_Queue;
}
ma non posso garantire che l'assegnazione di copia e copiare la costruzione sono equivalenti funzionalità.
Opzione 2:
ho potuto avere un metodo privato ...
std::queue<T, Container> GetQueue() const
{
std::lock_guard<std::mutex> lock(other.m_Mutex);
return m_Queue;
}
E poi nel costruttore fare questo ...
ConcurrentQueue(const ConcurrentQueue& other) : m_Queue(other.GetQueue()) {}
Ma questo potenziale (a seconda dell'ottimizzazione) usa il costruttore di copie di m_Queue una sola volta e il costruttore di mosse una volta. E inoltre non posso garantire che una copia e una mossa siano equivalenti a una semplice copia. Inoltre, il contenitore fornito dall'utente potrebbe essere bizzarro ed essere copiabile ma non modificabile, il che potrebbe anche causare problemi con questo approccio.
Quindi, cosa devo fare?
Pensi che dovrebbe essere sempre fatto in questo modo? – 0x499602D2
@ 0x499602D2 In realtà, penso che la situazione dovrebbe essere evitata. Non conosco abbastanza il tuo contesto attuale, o il problema che stai cercando di risolvere, per suggerire soluzioni alternative, ma so che non ho mai dovuto usare qualcosa del genere. In effetti, non riesco a pensare a un caso in cui ho copiato un contenitore tra i thread. –