Ho una domanda riguardante le ottimizzazioni che il compilatore può potenzialmente fare.Ottimizzazione del compilatore, thread sicuro?
Il codice qui sotto parlerà da sé (questo è un esempio):
typedef struct test
{
short i;
} s_test;
int function1(char *bin)
{
s_test foo;
lock(gmutex);
foo.i = *(int*)bin * 8;
unlock(gmutex);
sleep(5);
//
// Here anything can happen to *bin in another thread
// an inline example here could be: *(volatile int *)bin = 42;
//
int b = foo.i + sizeof(char*);
return (b > 1000);
}
Potrebbe il compilatore mai sostituire le ultime righe con
return ((*(int*)bin * 8 + sizeof(char*)) > 1000);
Non sembra essere il caso con -O2 o -O3 con gcc 4.4 ma potrebbe essere il caso con altri compilatori e con altre bandiere di compilazione?
Sostituire una variabile con un'espressione non è esattamente un'ottimizzazione, vero? – EJP
Per alcuni problemi relativi all'ottimizzazione del compilatore e alla sicurezza del thread, consultare http: // StackOverflow.it/questions/2001913/c0x-memory-model-and-speculative-loads-memorizza ed in particolare i documenti ad essi collegati. – janneb
Le modifiche a * bin possono verificarsi anche durante il mutex a meno che non si protegga ogni accesso a _ALL_ oggetti di memoria * bin può puntare a con gmutex. L'unica cosa che è protetta dal tuo mutex è la variabile locale foo che forse non è ciò che volevi. – slartibartfast