在包级别声明互斥变量是一种好习惯吗?

时间:2018-06-15 09:41:56

标签: http go concurrency global-variables mutex

在一个包中,我声明了一些变量和一个互斥变量。 我想用它来锁定或解锁get / set包级变量。

var mutex sync.Mutex
var tplPath = ""

func Prepare(c *gin.Context) {
    mutex.Lock()
    tplPath = "abc"
    mutex.Unlock()
}

使用互斥锁可以在并发http请求中防止tplPath上get / set的竞争条件吗?

1 个答案:

答案 0 :(得分:0)

使用包级别变量并不总是好的或总是坏的。视问题而定。

关于这个特定代码示例的唯一问题是,您可能最终处于锁定和解锁代码中多个位置的状态。

如果你选择沿着这条路走;这没关系,请考虑将tplPathmutex提取为类型。

// create type and expose values through getters and setters 
// to ensure the mutex logic is encapsulated.
type path struct {
    mu sync.Mutex
    val string
}

func (p *path) setPath(path string) {
    p.mu.Lock()
    defer p.mu.Unlock()
    p.val = path
}

func (p *path) path() string {
    p.mu.Lock()
    defer p.mu.Unlock()
    return p.val
}

var tplPath *path

func init() {
    // use package init to make sure path is always instantiated
    tplPath = new(path)
}

func Prepare(c *gin.Context) {
    tplPath.setPath("abc")
}