On Mon, Oct 22, 2007 at 00:07:50 +0100, Dave Korn wrote:
> Because of the 'as-if' rule. Since the standard is neutral with regard to
> threads, gcc does not have to take them into account when it decides whether
> an optimisation would satisfy the 'as-if' rule.
If this would be true, then the compiler is free to inject the
sequence
mov mem -> reg
mov reg -> mem
just _anywhere_. How the programmer can predict where and when to
lock the mutex to protect mem? The only thing we could relay on then
is that the compiler is sound, it wouldn't inject such a sequence
unless it really feels so. But still, how to determine when the
compiler really feels so?
Here's another piece of code, more real and sound this time:
#include <pthread.h>
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static int acquires_count = 0;
int
trylock()
{
int res;
res = pthread_mutex_trylock(&mutex);
if (res == 0)
++acquires_count;
return res;
}
Is it thread safe? Or rather, should the compiler preserve its
thread-safeness, as seen from the programmer's POV? Otherwise I don't
get how pthread_mutex_trylock() could possibly ever be used, because
it's exactly the case when you _have_ to do the access based on the
condition, "assume the worst" won't work here. GCC 4.3 with -O1
generates:
trylock:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl $mutex, (%esp)
call pthread_mutex_trylock
cmpl $1, %eax ; test res
movl acquires_count, %edx ; load
adcl $0, %edx ; maybe add 1
movl %edx, acquires_count ; store
leave
ret
--
Tomash Brechko