«Время жизни» переменной канала, созданной openwriter () - PullRequest
3 голосов
/ 29 марта 2019

Следующий код является еще одной попыткой создать класс с каналом. Здесь я передаю канал непосредственно со стороны вызывающей стороны, а не открываю его внутри класса. Несмотря на то, что код дает ожидаемый результат, я задаюсь вопросом, законно ли это делать, особенно вызывая openwriter() непосредственно в операторе new (как в случае baa). Другими словами, можно ли считать, что файл остается открытым, пока существует переменная (здесь output in 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 ]

3 голосов
/ 29 марта 2019

Да, это должно продолжать работать, поскольку ссылки на файлы и каналы подсчитываются.

См. Также https://chapel -lang.org / docs / modules / standard / IO.html # functions-for-closing-channel

Также обратите внимание, что в настоящее время временные переменные в Chapel уничтожаются в конце заключающего блока (а не в конце оператора, как это делает C ++).В этом случае это не имеет значения, поскольку счетчик ссылок канала будет увеличен в инициализаторе MyClass до завершения оператора var baa = ....Иногда это может вызывать удивление (см. https://github.com/chapel-lang/chapel/issues/11492), и поэтому мы собираемся внести коррективы (см. https://github.com/chapel-lang/chapel/issues/11534).

2 голосов
/ 29 марта 2019

Я считаю, что ваш код должен быть в порядке как есть. Документация к файлам и каналам указывает, что они подсчитаны, так что, пока какая-то переменная ссылается на них, они должны остаться в живых. Следующая цитата из документов версии 1.19 на Функции для закрытия каналов :

Файлы и каналы считаются ссылками. Каждый файл и канал закрываются автоматически, когда на него не остается ссылок. Например, если локальная переменная является единственной ссылкой на канал, канал будет закрыт, когда эта переменная выйдет из области видимости. Программы также могут явно закрывать файл или канал.

...