GO Sync.Once 使用

sync.Once 用于确保某个函数只执行一次,无论有多少个 goroutine 尝试执行它。它有一个方法 Do(f func()),传入需要执行的函数。 基本用法示例: package main import ( "fmt" "sync" ) func main() { var once sync.Once done := make(chan bool) // 模拟多个 goroutine 调用 for i := 0; i < 10; i++ { go func(x int) { // once.Do() 传入的函数只会执行一次 once.Do(func() { fmt.Printf("只执行一次: %d\n", x) }) // 这行每个 goroutine 都会执行 fmt.Printf("goroutine %d 完成\n", x) done <- true }(i) } // 等待所有 goroutine 完成 for i := 0; i < 10; i++ { <-done } }常见使用场景: 单例模式: type Singleton struct{} var ( instance *Singleton once sync.Once ) func GetInstance() *Singleton { once.Do(func() { instance = &Singleton{} }) return instance } 一次性初始化: type Config struct { settings map[string]string once sync.Once } func (c *Config) Load() { c.once.Do(func() { // 加载配置的代码 c.settings = make(map[string]string) c.settings["key"] = "value" }) } 延迟关闭资源: type Connection struct { once sync.Once quit chan struct{} } func (c *Connection) Close() { c.once.Do(func() { close(c.quit) }) } 错误处理: type ErrorHandler struct { once sync.Once err error } func (e *ErrorHandler) HandleError(err error) { e.once.Do(func() { e.err = err // 只处理第一个错误 fmt.Println("处理错误:", err) }) }sync.Once 的特点:

Archlinux Rdp 连接问题

如果你在非 Windows 端使用 RDP 协议远程控制一台登录微软账号的 Windows,那么连接时输入的用户名可能不是你的微软账号(邮箱),也不是去掉邮箱后缀后的剩余部分,更不是 Administrator,而是其他值,可以在被控端执行 echo %USERNAME% 查看,这个值虽然是自己设置的,但是系统设置里完全找不到,我试了半天真是有被气到。

Archlinux 中 Nvidia 驱动导致的 KDE Plasma 相关问题

本文针对 Turing (NV160/TUXXX) 及之后型号的显卡,可以通过 lspci -k | grep -A 2 -E "(VGA|3D)" 查看显卡型号 在 Linux 平台下 Nvidia 的驱动分为 3 种 nvidia/nvidia-dkms Nvidia 官方闭源驱动 nvidia-open/nvidia-open-dkms Nvidia 官方半开源驱动 nouveau 第三方开源驱动 官方驱动不论是闭源还是半开源,在游戏方面的性能都远好于第三方开源驱动。 带有 dkms 后缀的版本与不带的版本区别在于,不带后缀的版本用于 linux 标准内核,而带后缀的版本用于其他内核。 问题及解决方案 官方内核 在驱动更新到 555 主版本号之后会出现 KDE Plasma 动画卡顿和掉帧的情况,这是由于 Nvidia 官方引入的 GSP(RISC-V 处理器) 不稳定导致的。 在目前的驱动版本(560)中该问题仍然存在,可以通过禁用 GSP 解决,但是只有闭源驱动可以禁用 GSP,半开源驱动无法实现。
0%