On Friday, 21 October 2016 09:05:10 UTC-4, Michael Liu wrote:
>
> I've a race scenario used with Mutex.Lock with Lock() and Unlock(). now 
> multi-routines try to lock the resource and start a few logical code if the 
> Lock.Lock() succesfully. other routines don't need to block util 
> Lock.Unlock() that they can do the above logicals with next time or in 
> future(logical may changes some variables and those variables' change could 
> be see with latency). That looks like a Trylock() implemetion.
>

One reason the TryLock method does not exist is that its behavior cannot be 
expressed without reference to some notion of goroutine identity.  That is, 
its doc comment would read "succeeds immediately if the current goroutine 
already holds the lock".  The designers of the language have strived to 
avoid making goroutine state relevant to the behavior of any function since 
it makes programs had to reason about and prevents programmers from freely 
moving work to a different goroutine.

Another reason is described in Chapter 9 of our book (gopl.io): "There is a 
good reason Go’s mutexes are not re-entrant. The purpose of a mutex is to 
ensure that certain invariants of the

shared variables are maintained at critical points during program execution. 
One of the invariants is “no goroutine is accessing the shared variables,” 
but there may be additional invariants specific to the data structures that 
the mutex guards. When a goroutine acquires a mutex lock, it may assume 
that the invariants hold. While it holds the lock, it may update the shared 
variables so that the invariants are temporarily violated. However, when it 
releases the lock, it must guarantee that order has been restored and the 
invariants hold once again. Although a re-entrant mutex would ensure that 
no other goroutines are accessing the shared variables, it cannot protect 
the additional invariants of those variables."



-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to