首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >v4线程安全模式

v4线程安全模式
EN

Stack Overflow用户
提问于 2021-07-30 08:40:02
回答 1查看 83关注 0票数 1

我是这样写代码的:

  1. 首先我用ants创建例程池:

代码语言:javascript
复制
var pool, _ = ants.NewPoolWithFunc(5, func(commitDiff interface{}) {
    AnalyzeCommitDiff(commitDiff.(diffParsedType))
})

*函数AnalyzeCommitDiff()包含我的antlr_analysis函数

然后我写了这些:

代码语言:javascript
复制
var (
    lexerPool *sync.Pool = &sync.Pool{New: func() interface{} {
        return javaparser.NewJavaLexer(nil)
    }}
    parserPool *sync.Pool = &sync.Pool{New: func() interface{} {
        return javaparser.NewJavaParser(nil)
    }}
    newTreeShapeListener *sync.Pool = &sync.Pool{New: func() interface{} {
        return new(TreeShapeListener)
    }}
)

func executeJava(diffText string) javaparser.AnalysisInfoType {

    input := antlr.NewInputStream(diffText)


    lexer := lexerPool.Get().(*javaparser.JavaLexer)
    defer lexerPool.Put(lexer)
    lexer.SetInputStream(input)

    stream := antlr.NewCommonTokenStream(lexer, 0)

    p := parserPool.Get().(*javaparser.JavaParser)
    defer parserPool.Put(p)
    p.SetTokenStream(stream)

    //p.AddErrorListener(antlr.NewDiagnosticErrorListener(true))

    p.BuildParseTrees = true

    p.GetInterpreter().SetPredictionMode(antlr.PredictionModeSLL)

    tree := p.CompilationUnit()

    listener := newTreeShapeListener.Get().(*TreeShapeListener)
    defer newTreeShapeListener.Put(listener)

    antlr.ParseTreeWalkerDefault.Walk(listener, tree)
    return javaparser.Infos
}

但问题很明显是因为线程不安全。如何使我的代码线程安全?有人能给我举个例子吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-31 10:30:26

线程池不能使用ANTLR4。出于性能原因,除了解析器或lexer访问共享DFA的一个地方外,没有额外的线程处理。

因此,使用线程的唯一方法是将lexer/解析器实例关联到线程,并仅从这个单个线程访问该线程。在每个解析器实例中使用一个专用线程,不要在线程之间共享词汇/解析器。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68587939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档