英文:
why didn't use lock to sync in log package
问题
SetOutput
方法使用mu
来进行锁定,而SetFlags
方法没有使用mu
进行锁定。这是因为它们对共享数据的访问方式不同。
在SetOutput
方法中,通过使用std.mu.Lock()
和std.mu.Unlock()
来锁定和解锁std
结构体中的互斥锁mu
。这是因为在设置输出目标时,可能会涉及到对共享数据的修改操作,需要确保在多个goroutine同时访问时的数据一致性和线程安全性。
而在SetFlags
方法中,没有对mu
进行锁定。这是因为设置输出标志位时,并不涉及对共享数据的修改操作,只是简单地返回或设置标志位的值。因此,不需要使用互斥锁来保护对共享数据的访问。
通过这种方式,可以根据具体的操作需求来选择是否使用互斥锁来保护共享数据的访问。
英文:
I'm reading log source code,I'm confused in here:
// SetOutput sets the output destination for the standard logger.
func SetOutput(w io.Writer) {
std.mu.Lock()
defer std.mu.Unlock()
std.out = w
}
// Flags returns the output flags for the standard logger.
func Flags() int {
return std.Flags()
}
// SetFlags sets the output flags for the standard logger.
func SetFlags(flag int) {
std.SetFlags(flag)
}
why SetOutPut
use mu
to lock but SetFlags
don't use mu
to lock?
答案1
得分: 3
SetOutput
正在修改std
默认日志记录器的内部状态。
log.SetFlags
在std
上调用SetFlags
,它已经锁定了日志记录器本身。
英文:
SetOutput
is altering the internal state of the std
default Logger.
log.SetFlags
is calling SetFlags
on std
, which already locks the logger itself.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论