go语言的map多协程访问时需要加锁吗

Python020

go语言的map多协程访问时需要加锁吗,第1张

go语言的map多协程访问时需要加锁

支持==和!=操作就可以做key,实际上只有function、map、slice三个kind不支持作为key,因为只能和nil比较不能和另一个值比较。布尔、整型、浮点、复数、字符串、指针、channel等都可以做key。

struct能不能做key要看每一个字段,如果所有字段都可以做key,那这个struct就可以。有一个字段不能做key,这个struct就不能做key。array也是,元素类型能做key,那这个array就可以。

例如:

type Foo map[struct {

B bool

I int

F float64

C complex128

S string

P *Foo

Ch chan Foo

}]bool

每一个字段都可以做key,Foo就可以做key。再如:

type Foo map[struct {

Fn func() Foo

M map[*Foo]int

S []Foo

}]bool

有一个字段不能做key、Foo就不允许做key,而这三个字段都不能。

字段是递归检查的:

type Foo map[struct {

Sub struct {

M map[*Foo]bool

}

}]bool

Sub的M字段不能做key,Sub就不能做key,Foo也就不能做key。

总之想把一个数据结构用于map的key,就不能包含function、map和slice。

因为shared_ptr有两个数据成员,读写操作不能原子化”使得多线程读写同一个shared_ptr对象需要加锁。这个在我看来显而易见的结论似乎也有人抱有疑问,那将导致灾难性的后果,值得我写这篇文章。本文以boost::shared_ptr为例,与std::shared_ptr可能略有区别。shared_ptr的数据结构shared_ptr是引用计数型(referencecounting)智能指针,几乎所有的实现都采用在堆(heap)上放个计数值(count)的法(除此之外理论上还有用循环链表的法,不过没有实例)。具体来说,shared_ptr包含两个成员,一个是指向Foo的指针ptr,另一个是ref_count指针(其类型不一定是原始指针,有可能是class类型,但不影响这里的讨论),指向堆上的ref_count对象。ref_count对象有多个成员,其中deleter和allocator是可选的。