Recentemente ho appreso che i compilatori ottimizzano il codice riorganizzando le istruzioni e che questo può essere controllato utilizzando le barriere.Ho bisogno di un recinto o di una barriera o qualcosa del genere quando i blocchi/sblocchi mutex sono sepolti in profondità nelle chiamate di funzione?
IIRC, il blocco di un mutex crea una barriera e lo sblocco di un mutex crea anche una barriera, per impedire che il codice all'interno della sezione critica esca.
Quindi pthread_mutex_lock e pthread_mutex_unlock devono essere implicitamente queste "barriere". Cosa succede se ho una classe come questa, che avvolge il mio mutex?
class IMutex {
public:
virtual void lock() = 0;
virtual void unlock() = 0;
};
mi sembra, il compilatore non sapranno che sto chiamando pthread_mutex_lock() all'interno di blocco(), e pthread_mutex_unlock() all'interno di sblocco(), perché è tutto virtual'd via.
Questo porterà a bug? Devo specificare manualmente le barriere in qualche modo?
Penso che una chiamata di funzione sarebbe un ostacolo al codice in movimento del compilatore. Usiamo mutex e non aggiungiamo barriere. Ci sono barriere di memoria che sono una cosa diversa. –
oh, questo ha senso. Grazie! – Verdagon
Sì, nessun compilatore sensato riordina intorno a una chiamata di funzione virtuale ... –