由 openwriter() 创建的通道变量的"生命周期"



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

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 );
}

是的,这应该继续有效,因为文件和通道是引用计数的。

另请参阅 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.19 版关于关闭通道的功能的文档:

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

相关内容

  • 没有找到相关文章

最新更新