首页 > 解决方案 > 为什么需要互斥锁来设置 Logger 结构的字段?

问题描述

在标准库的以下代码中:

type Logger struct {
    mu     sync.Mutex // ensures atomic writes; protects the following fields
    prefix string     // prefix on each line to identify the logger (but see Lmsgprefix)
    flag   int        // properties
    out    io.Writer  // destination for output
    buf    []byte     // for accumulating text to write
}

mu用于设置 的字段Loggermu也用于写log( l.out.Write(l.buf))

为什么我们需要 mutex( mu) 来设置Logger结构的这个字段?是mu启用多个 go-routines 来执行原子写入吗?

标签: go

解决方案


是的。正如对mu sync.Mutexreads 的评论,它确保原子写入并保护字段 - prefix, flag, out, buf.

它允许同时使用方法/函数 - SetFlags(int), Prefix(), SetPrefix(string), SetOutput(io.writer), Flags, SetFlags(int), Output(int, string)。前面提到的从/向字段读取/写入 - prefix,和使用互斥体flag,以便它们可以安全地被多个 goroutine 并发使用。outbuf

无论是使用使用创建的自定义 Loggerlog.New(io.writer, string, int)还是使用全局 Logger,同一个 logger 很可能同时被多个 goroutine 使用。


推荐阅读