Tengo una pregunta con respecto a las optimizaciones que el compilador puede hacer.Optimización del compilador, ¿Thread Safe?
El código siguiente hablará por sí mismo (esto es un ejemplo):
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);
}
Podría el compilador nunca sustituir a las últimas líneas con
return ((*(int*)bin * 8 + sizeof(char*)) > 1000);
No parecía ser el caso utilizando -O2 o -O3 con gcc 4.4 pero ¿podría ser el caso con otros compiladores y con otros indicadores de compilación?
Reemplazar una variable por una expresión no es exactamente una optimización, ¿o sí? – EJP
Para algunos problemas relacionados con la optimización del compilador y la seguridad de hilos, consulte http: // stackoverflow.com/questions/2001913/c0x-memory-model-and-speculative-loads-stores y, en particular, los documentos vinculados allí. – janneb
Los cambios en * bin también pueden ocurrir durante su exclusión mutua, a menos que proteja todos los accesos a _ALL_ objetos de memoria * a los que bin pueda apuntar con el gmutex. Lo único que está protegido por su mutex es la variable local foo, que quizás no sea lo que usted quería. – slartibartfast