GC安全
当过程不通过调用GC不安全的过程直接或间接访问任何含有GC内存的全局变量(string, seq, ref 或闭包)时,我们称过程 p GC安全 。
gcsafe 可用于将proc标记为gcsafe,否则此属性由编译器推断。 请注意, noSideEffect 意味着 gcsafe 。创建线程的唯一方法是通过 spawn 或 createThread 。 被调用的proc不能使用 var 参数,也不能使用任何参数包含 ref 或 closure 类型。 这会强制执行 无堆共享限制 。
从C导入的例程总是被假定为 gcsafe 。 要禁用GC安全检查,可以使用 —threadAnalysis:off 命令行开关。 这是一种临时解决方法,可以简化从旧代码到新线程模型的移植工作。
要覆盖编译器的gcsafety分析,可以使用 {.gcsafe.} 编译指示:
- var
- someGlobal: string = "some string here"
- perThread {.threadvar.}: string
- proc setPerThread() =
- {.gcsafe.}:
- deepCopy(perThread, someGlobal)
未来的方向:
- 可能会提供一个共享的GC堆内存。