警告:' matchIter'不是GC安全的,因为它访问' x'这是一个全球使用GC的内存[GcUnsafe2]

时间:2018-03-09 15:17:44

标签: nim jester

在nim中构建此代码时:

import jester, asyncdispatch    
let stuff = "thing"    
routes:
  get "/":
    resp stuff
runForever()

导致:

  

mytest.nim(3,1)模板/泛型实例化   lib / core / macros.nim(369,70)模板/泛型实例化从这里开始   lib / pure / asyncmacro.nim(355,31)警告:' matchIter'不是GC安全的   因为它访问'东西'这是一个全球使用GC的内存   [GcUnsafe2]

我想它指的是变量stuff,我想它很难诊断,因为小丑路线是某种DSL。

如果消息意味着它意味着什么,那为什么它只是一个警告?还是假阳性?或者更重要的是,在路线中使用变量的概念根本不可能吗?

1 个答案:

答案 0 :(得分:2)

Jester生成的过程已标记为{.gcsafe.},这使编译器检查过程是否访问任何全局变量。

只要Jester(和您的应用程序)是单线程的,但是一旦您的程序使用多个线程(例如并行处理请求),访问全局变量不应该是您的应用程序的问题,您将需要解决这个问题。

解决此问题的一种方法是使用{.threadvar.}https://nim-lang.org/docs/manual.html#threads-threadvar-pragma

希望这有帮助!