Appreciate the sample, very much. Go is my first language, and still learning. It's just a hobby at the moment (which I'm sure you can tell by my amateur code). Still need to learn about coding standards, etc.
On Thursday, December 29, 2016 at 2:13:54 PM UTC-6, Val wrote: > > Hi Eric > here is some sample code, with > - a "correct" implementation <https://play.golang.org/p/tLjXXcHq5H> : it > passes the race detector, and it behaves as expected : no overlapping of > queries on a specific file. > - an "incorrect" impl <https://play.golang.org/p/TDpLJAfXm6> that doesn't > guard the map : it would seem like it works, but the race detector > immediately reports the fraud. > > The only subtle thing is to not confuse the mutex for the map, and the > mutex for each file. There should not exist a "function that handles the > unlocking of the map[string]*sync.Mutex", the map access itself is > ultra-fast and the map locking should be nothing more than mutex.Lock() ; > defer mutex.Unlock() . It is important to release the global mutex > *before* executing the sqlite query. > > For the general problem of re-acquiring a mutex, I learned today in the > archives that code involving recursive (reentrant) mutex locking is frowned > upon, regarded as a code smell, a bad practice that is very bug-prone. > > Cheers > Val > > On Thursday, December 29, 2016 at 7:43:19 PM UTC+1, Eric Brown wrote: >> >> Thanks Val, I actually tried that approach... and failed. Perhaps I >> incorporated it wrong. I put the handling of locking/unlocking of the >> map[string]*sync.Mutex in it's own function, which was encapsulated in the >> global mutex like you suggested. Only problem was, was that the database >> function ran once... because when it went to call the function that handled >> the unlocking of the map[string]*sync.Mutex, it was already locked by a >> previous goroutine trying to lock the map[string]*sync.Mutex. >> >> Hahaha... I hope I made sense. My brain is hurting here. It doesn't >> help that I'm fairly new to this type of stuff in Go. Appreciate you >> assistance, however. Thank you! >> >> >> >> On Thursday, December 29, 2016 at 1:28:34 AM UTC-6, Val wrote: >>> >>> Hello Eric >>> You may use a map[string]*sync.Mutex where key is the DB filepath, and >>> protect that map with a global mutex. >>> >>> Note that a mutex value must not be copied, often it is necessary to use >>> pointers. >>> >> -- 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.