openwriter()创建的频道变量的“生命周期”

时间:2019-03-29 13:42:26

标签: file parameter-passing chapel

以下代码是使用通道创建类的另一种尝试。在这里,我直接从调用方传递一个通道,而不是在一个类中打开它。尽管代码给出了预期的结果,但我想知道这样做是否合法,特别是直接在openwriter()语句中调用new(例如baa) 。换句话说,只要存在一个引用基础文件的变量(这里是output中的Myclass),即使实际的通道变量是临时的,也可以假设文件保持打开状态吗?

class Myclass
{
    var output: channel;
    proc init( output = stdout )
    {
        this.output = output;
    }
}

proc main()
{
    var foo = new owned Myclass();
    foo.output.writeln( 10 );   // written to stdout

    var baa = new owned Myclass( openwriter("test.out") );
    baa.output.writeln( 20 );   // written to file
    baa.output.writeln( 30 );
}

2 个答案:

答案 0 :(得分:3)

是的,由于文件和通道都被引用计数,因此这应该继续起作用。

另请参阅https://chapel-lang.org/docs/modules/standard/IO.html#functions-for-closing-channels

另外,请注意,当前,Chapel中的临时变量在封闭块的末尾被破坏(而不是在语句的末尾,这是C ++的作用)。在这种情况下没有关系,因为在语句var baa = ...完成之前,将在MyClass初始化程序中增加通道的引用计数。有时这可能令人惊讶(请参阅https://github.com/chapel-lang/chapel/issues/11492),因此我们正在考虑进行调整(请参阅https://github.com/chapel-lang/chapel/issues/11534)。

答案 1 :(得分:2)

我相信您的代码应该保持原样。文件和通道的文档表明它们被引用计数,因此只要某些变量引用它们,它们就应该保持活动状态。以下引用来自Functions for Closing Channels上的1.19版文档:

  

文件和通道被引用计数。每个文件和通道在没有引用时都会自动关闭。例如,如果局部变量是对通道的唯一引用,则当该变量超出范围时,将关闭该通道。程序还可以显式关闭文件或通道。