Re:In-memory key-value store in C, Go and Python
by jbarham on Wednesday March 21, 2012 @01:18AM
(#3733244)
You're correct that updating a map from multiple goroutines without synchronizing is unsafe. But the overhead of using a RWMutex (http://weekly.golang.org/pkg/sync/#RWMutex) in this case should be negligible compared to the I/O code.
The big win is that Go allows you to write straightforward concurrent code but under the hood uses high-performance system calls like epoll.
EDIT: Here's a thread-safe version: https://github.com/jbarham/Key-Value-Polyglot/blob/master/me.... Still plenty fast.
Re:In-memory key-value store in C, Go and Python
by teejae on Wednesday March 21, 2012 @10:40AM
(#3734580)
FYI, In the Go version, the lock can be added more simply, without the rw:
// Synchronize map access between multiple goroutines. type cache struct { m map[string]string sync.RWMutex }
Then, you can just use:
cache.Lock/Unlock/RLock/RUnlock directly. It's clearer. The beauty of Go's mixins.
edit: (that said I am not sure if the C version is thread safe either I haven't read the docs for the hash table he is using.)
edit 2: (looks like the C version is not thread safe either).
[1] https://github.com/grahamking/Key-Value-Polyglot/blob/master...
[2] http://golang.org/doc/go_faq.html#atomic_maps