icexin 最近的时间轴更新
icexin

icexin

V2EX 第 97481 号会员,加入于 2015-02-14 19:43:08 +08:00
今日活跃度排名 30485
将 Go 程序跑在裸机上之 LibOS
  •  3   
    Go 编程语言  •  icexin  •  2021-08-09 11:51:44 AM  •  最后回复来自 wupeaking
    15
    Go 编写的跑在 x86 裸机上的 unikernel
    Go 编程语言  •  icexin  •  2020-10-18 19:14:41 PM  •  最后回复来自 icexin
    22
    go 实现的 Minecraft
  •  2   
    Go 编程语言  •  icexin  •  2018-04-08 01:20:22 AM  •  最后回复来自 zjyl1994
    27
    icexin 最近回复了
    一般是通过 jit 编译到机器码的,具体实现上可以有不经过优化的一遍翻译,也可以有多遍的优化编译。可以参考一下 v8 的 https://v8.dev/blog/liftoff
    2021-11-30 14:50:41 +08:00
    回复了 sunny1688 创建的主题 问与答 关于 golang 碰到的一个问题!
    大家回答的点都集中在内存回收上,实际的问题是没有加锁导致的不变式被打破的问题。

    实际的 slice 包含 data ,len 和 cap 字段,这些大家也都知道了。slice 结构的不变式是:在任意时刻,data 指向的数据长度都是至少是 len 长度,否则访问 len-1 的数据就会 内存错误。

    在题主的代码里面,多个 goroutine 同时对 demo.llist 进行赋值,但因为没有加锁,所以赋值不是原子的,从而会出现一个 goroutine 刚赋值了 data ,还没来得及赋值 data 和 cap 就被其他 goroutine 拿去用了, 破坏了不变式, 从而在扩容的时候就访问了非法内存,从而 panic 。

    一段简单代码就可以复现:


    package main

    import "log"

    type T struct {
    A, B int
    }

    func step(t T) T {
    if t.B != t.A*2 {
    log.Panic(t)
    }
    x := t.A+1
    return T{
    A: x,
    B: 2*x,
    }
    }

    func main() {
    var t = T{
    A: 1,
    B: 2,
    }
    for {
    go func() {
    t = step(t)
    }()
    }
    }
    2021-11-30 11:19:12 +08:00
    回复了 ryougifujino 创建的主题 NAS 威联通大家存储用的什么模式?
    @rwecho 我是用了两个静态盘,一个纯粹备份,按理备份盘寿命会长一些。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   941 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 21:05 · PVG 05:05 · LAX 13:05 · JFK 16:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.