Go:如何同步和共享数据

时间:2016-10-17 21:35:01

标签: go

我正在写一个net / http服务器。我的请求处理程序需要访问由另一个go-routine更新的一些共享数据。此go-routine保持单个结构更新,并且所有net / http处理程序都需要访问相同的结构。

type MyData struct {
  Expiration time.Time
  A  string
  B  string
  C string
}

func update(data MyData) {
  go func() {
    for {
      if data.Expiration >= time.Now() {
        // set A, B, C
      }
      // sleep
    }
  }()
}

将单个常见MyData用于其他常规程序的最佳方法是什么?我在考虑一个频道,但频道的每个读者都应该获得相同的MyData。问题是从频道读取会弹出该频道的项目。我想我正在寻找如何在读者方面看Peek(),以及在作者更新的时候在作者方面看Drain()。

1 个答案:

答案 0 :(得分:3)

基于互斥锁的解决方案

type MyData struct {
    Expiration time.Time
    A  string
    B  string
    C string
}

type MutexedMyData struct {
    sync.RWMutex
    MyData MyData
}

var m = &MutexedMyData{}


func (m *MutexedMyData) Update(my_data MyData)  {
    m.Lock()
    m.MyData = my_data
    m.Unlock()
}

func (m *MutexedMyData) Read() MyData {
    u.RLock()
    value := m.MyData
    u.RUnlock()

    return value
}