map的值是指针,修改的指针的值是否线程安全

wu0407 · · 807 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

简单来说,结构体里的字段是map类型,map的值类型是个指针,一个goroutine线程修改指针的值,另一个goroutine读取这个值,是否线程安全?如果不是,大神们有什么建议,怎么修改 场景是这样的,一个goroutine线程会执行 `CreateHealthCheck`,添加一个`status`到`ApiserverHealth`并会启动一个goroutine来修改`readinessProbe`的`ready`字段。另一个goroutine会`GetStatus`查询状态。 ``` type ApiserverHealth struct { manager *Manager status map[int64]*readinessProbe stopCh <-chan struct{} statusLock sync.RWMutex } type readinessProbe struct { ready bool stopCh <-chan struct{} client *resty.Client serverURL string } // 每个id的status会启动一个goroutine来执行修改ready字段 func (r *readinessProbe) start() { probeFunc := func() { resp, err := r.client.R().Get(r.serverURL) if err != nil { // lock ? r.ready = false ginfw.ConsoleLogger.Debugf("failed to probe apiserver %s, %v", r.serverURL, err) } r.ready = true } // 无限循环执行probeFunc,直到r.stopCh关闭 wait.BackoffUntil(probeFunc, wait.NewExponentialBackoffManager(800*time.Millisecond, 30*time.Second, 2*time.Minute, 2.0, 1.0, &clock.RealClock{}), true, r.stopCh) } // 另一个线程添加status func (c *ApiserverHealth) CreateHealthCheck(id int64) { stopCh := make(chan struct{}) probe := &readinessProbe{ stopCh: stopCh, client: resty.New(), serverURL: probePath, } c.setStatus(id, probe) go probe.start() } func (c *ApiserverHealth) setStatus(id int64, probe *readinessProbe) { c.statusLock.Lock() defer c.statusLock.Unlock() c.status[id] = probe } // 另一个线程会执行这份 func (c *ApiserverHealth) GetStatus(id int64) bool { c.statusLock.RLock() defer c.statusLock.RUnlock() return c.status[id].ready } ```

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

807 次点击  
加入收藏 微博
4 回复  |  直到 2022-02-12 20:31:56
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传