2015-06-09 2 views
7

Io uso std::mutex e std::lock_guard in una vera e propria maniera RAII in tutta la mia domanda:std :: :: mutex blocco non riesce su Windows, il codice di errore 3

struct Foo { 
    int f() const 
    { 
     std::lock_guard<std::mutex> locker(m_mutex); 
     return m_i; 
    } 
private: 
    int m_i = 0; 
    mutable std::mutex m_mutex; 
}; 

E 'sempre funzionato, ma ho aggiunto il parallelismo a uno più classe solo ora, e in questa nuova classe locker getta std::system_error. Il problema è qui (xthread intestazione):

inline int _Mtx_lockX(_Mtx_t *_Mtx) 
{ // throw exception on failure 
    return (_Check_C_return(_Mtx_lock(_Mtx))); 
} 

_Mtx_lock restituisce 3, mentre il valore atteso è 0. Non ho idea di quello che 3 mezzi.

VS2013, runtime v120_x64.

+3

Invia il codice che crea l'istanza del mutex. –

+0

@WernerErasmus: ha ampliato la domanda. –

+0

Forniscici abbastanza codice per riprodurre il problema. Oppure controlla lo stack delle chiamate quando si verifica l'errore e potrebbe essere ovvio. –

risposta

6

L'errore come menzionato da @Phantom (_Thrd_busy) implica che il blocco è stato acquisito in modo ricorsivo. Vedi anche questo answer

+3

Questo è tutto, il passaggio a 'std :: recursive_mutex' ha risolto il problema! Probabilmente dovrei rifattorizzare il mio codice per evitare il blocco ricorsivo. –