go - 为什么需要互斥锁来设置 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
用于设置 的字段Logger
。mu
也用于写log( l.out.Write(l.buf)
)
为什么我们需要 mutex( mu
) 来设置Logger
结构的这个字段?是mu
启用多个 go-routines 来执行原子写入吗?
解决方案
是的。正如对mu sync.Mutex
reads 的评论,它确保原子写入并保护字段 - prefix
, flag
, out
, buf
.
它允许同时使用方法/函数 - SetFlags(int)
, Prefix()
, SetPrefix(string)
, SetOutput(io.writer)
, Flags
, SetFlags(int)
, Output(int, string)
。前面提到的从/向字段读取/写入 - prefix
,和使用互斥体flag
,以便它们可以安全地被多个 goroutine 并发使用。out
buf
无论是使用使用创建的自定义 Loggerlog.New(io.writer, string, int)
还是使用全局 Logger,同一个 logger 很可能同时被多个 goroutine 使用。
推荐阅读
- javascript - 当确定有实现时获得 HTTP 501 Not Implemented?
- c# - 在 .NET Web API 中重用与 Dapper 的数据库连接
- node.js - Node Express Post 500(内部服务器错误)jquery-3.4.1.min.js
- python - 基于输入执行查找的问题
- html - 如果需要,使用滚动条引导列全高
- vagrant - 未检测到 stdlib 模块
- mautic - 我在哪里可以访问我的 Mautic 活动内容(文件路径)
- python - 在 pycharm 中对 XSLT 文件进行单元测试
- list - 在它的列表中查找缺席字典
- r - R函数不遍历列但重复第一行结果