Query: Will a MutexGuard object release before a function return value is copied?

Query: Will a MutexGuard object release before a function return value is copied?

Post by tropostrop » Mon, 22 Dec 2003 00:03:33


Query: Will a MutexGuard object release before a function return value
is copied?

Consider the C++ code:

class MutexGuard //A familiar sort of class for making mutexes
exception-safe
{
. . .
~MutexGuard(); //releases the mutex when the stack pops
}

int MyClass::increment(int value) //thread-safe
{
MutexGuard myguard(m_mutex); //lock the private member data
m_privatemember = value;
++m_privatemember;
return m_privatemember;
}

When the function completes, the new value of m_privatemember is
copied for
return-by-value, myguard is popped off the stack, its destructor runs,
and the mutex is released.

Is there any chance that the mutex is released before m_privatemember
is copied for return-by-value? If that happened, another thread could
nip in and change the value before it is copied.

Tropos
 
 
 

Query: Will a MutexGuard object release before a function return value is copied?

Post by Joe Seig » Mon, 22 Dec 2003 23:49:37


...

It should work as long as the MutexGuard dtor calls an external mutex
unlock function which should cause the compiler to drop optimization at
that point. So the compiler would have to do the copy before the dtor
since it couldn't assume the dtor did not have side effects.

Synchronization functions currently depend on this compiler drops
optimization on external calls feature to help enforce correct semantics.

Joe Seigh