On Tuesday, 16 May 2017 10:57:46 UTC+3, Val wrote:
>
> It is not safe to do so and you're understandably asking yourself "but
> why? my goroutines are working on different already existing entries, so
> what's going on exactly?".
> It turns out that a go builtin map is an opaque stucture that is free to
> completely reorganize itself at any write operation. Thus, it must be
> regarded as a whole when thinking about data races. The docs are very
> explicit about this restriction, and the runtime and the race detector do
> their best at crashing to guide you into enforcing the rule.
>
> Although it would be "conceivable" for a map to reorganize itself on read
> operations (say, to move recently or frequently accessed entries to
> optimized buckets), go builtin maps don't do that and it is safe to have
> multiple concurrent readers, as long as no writer wolf enters.
>
There are additionally subtler issues involved. Because the compiler
doesn't know that it is being accessed concurrently, it may make
optimizations that are not safe...
Even a simple example as this will potentially have problems:
var data = map[string]bool{}
func watch() {
var x int
data["running"] = true
for data["running"] {
x++
}
}
func kill() {
time.Sleep(time.Second)
data["running"] = false
}
func main() {
go kill()
watch()
}
This program may or may not terminate... because the compiler is free to
optimize watch function as:
func watch() {
var x int
data["running"] = true
tmp := data["running"]
for tmp {
x++
}
}
+ Egon
> HTH
> Val
>
> On Tuesday, May 16, 2017 at 7:10:56 AM UTC+2, Yan Tang wrote:
>>
>> Hi,
>>
>> I am aware of golang map is not safe for concurrent access, especially
>> when there is at least one writer.
>>
>> However, I want to know that if the map has been pre-populated, and
>> different coroutines access (read/write) different key/value pair, is it
>> safe to do so? There is no deletion or adding keys after the
>> initialization.
>>
>> I think it should be safe (having been doing this in C++ quite
>> frequently) but just want to double check. Thanks.
>>
>> Yan
>>
>
--
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 [email protected].
For more options, visit https://groups.google.com/d/optout.