Chapelアトミックインスタンス変数の初期化

カイル

昨年の問題の解決策は、インスタンス変数をアトミックにして、他のタスクがそれらの変更を確認できるようにすることでした。メソッドのwhileループがスタックします。それ自体にフィールドの割り当てを追加すると、問題が修正されます

今年は、コンストラクターをイニシャライザーに置き換えます。https://chapel-lang.org/docs/master/language/evolution.html#readme-evolution-initializers-replace-constructors)残念ながら、アトミックインスタンス変数を初期化する方法がわかりません。このコードは機能しません:

class FakeSemaphore {
    var tokens : atomic int;

    proc init(initTokens : int) {
        this.tokens.write(initTokens);
    }
}

これにより、チャペル1.18では次のようになります。

$ chpl FakeSemaphore.chpl
FakeSemaphore.chpl:4: In initializer:
FakeSemaphore.chpl:5: error: field "tokens" used before it is initialized

アトミックインスタンス変数をどのように初期化する必要がありますか?

ブラッド

簡単に言うthis.complete()this.tokens.write()、ここに示すようへの呼び出しの前にへの呼び出しを挿入する必要がありますオンラインで試す):

class FakeSemaphore {
    var tokens : atomic int;

    proc init(initTokens : int) {
        this.complete();
        this.tokens.write(initTokens);
    }
}

var s = new owned FakeSemaphore(10);
writeln(s);

さらに詳細に:

チャペルイニシャライザーは、複数のフェーズがあると考えることができます。最初は、どのフィールドも初期化されておらず、オブジェクトとそのフィールドは初期化されるまで使用できません。フィールドは、代入演算子(=)を使用して明示的に初期化することも、コンパイラーによって暗黙的に初期化することもできます

組み込み呼び出しthis.complete()は、オブジェクトが初期化され、使用できる状態にあることを示すために使用されます。これに遭遇すると、コンパイラは、ユーザーがしなかった残りのフィールドの初期化を処理します。の呼び出し後、this.complete()オブジェクトを使用する準備が整います。

この場合、論理的にメソッド呼び出しthis.tokens.write(initTokens)使用して初期化を行っていてもthis.tokens、Chapelは代入演算子を使用していないため、フィールドの初期化として認識しません。さらに、これはフィールドでのメソッド呼び出しであるため、オブジェクトが初期化された後(つまり、の呼び出し後this.complete())にのみ許可されます

Chapelは、アトミック変数の直接初期化をサポートするという長年の意図(GitHubの問題ページの問題#5037キャプチャ)を持っていることに注意してください。これがサポートされると、次のように記述できるようになります。

class FakeSemaphore {
    var tokens : atomic int;

    proc init(initTokens: int) {
      this.tokens = initTokens;
    }
}

この機能は2019年に利用可能になる予定です。また.write()問題#8847強制的に使用するのはなく、アトミック変数を直接割り当てることができるようにするための関連リクエストにも注意してください。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

初期化ブロックvsコンストラクターvs変数初期化

分類Dev

コンストラクターでの空のインスタンス変数の初期化

分類Dev

メソッドによるJavaインスタンス変数の初期化

分類Dev

Javaのコンストラクターでのクラス変数の初期化

分類Dev

プライベートコンストラクターを持つクラスでの静的変数の初期化

分類Dev

MvvmCrossセットアップインスタンスの初期化中のInvalidProgramException

分類Dev

インスタンス変数の初期化に関して混乱

分類Dev

インスタンス変数の初期化:慣用的な方法

分類Dev

インターフェイスインスタンス変数の初期化

分類Dev

プライベート変数を初期化する抽象クラスのFortranコンストラクター

分類Dev

インスタンス変数は、各オブジェクトの初期化で同じです

分類Dev

コンストラクターの実行順序/順序:関数内の静的変数(クラスインスタンス)の依存初期化

分類Dev

暗黙的にインスタンス化された変数テンプレートの動的初期化の順序

分類Dev

コンポーネントクラス変数の初期化

分類Dev

マルチスレッドクライアントでのCOMオブジェクトの初期化とインスタンス化

分類Dev

インスタンス化せずにプロトタイプのJavascriptアクセス変数

分類Dev

静的アトミックメンバー変数を初期化します

分類Dev

別のメソッドのコンストラクター内で最終変数を初期化します

分類Dev

アトミックペアをインスタンス化できないのはなぜですか?

分類Dev

2つのコンストラクタでfinal変数を初期化します

分類Dev

PHP - 親変数の初期化 (コンストラクター付き)

分類Dev

関数ポインタを使用したマップのリスト初期化を含むクラス

分類Dev

クラスコンストラクターで初期化されたタイプのストリームのメンバー変数を使用できますか?

分類Dev

Rubyクラスのインスタンス変数を別のクラスの新しいインスタンスに初期化する方法は?

分類Dev

TYPO3RTEフォント/ cssはバックエンド設定(タイプミスとRTE初期化)に応じて変化します

分類Dev

インスタンス変数初期化のスレッドセーフについて

分類Dev

複数のインデックスでのNSMutableArrayの初期化

分類Dev

Python:locals()を使用したプログラムによるクラスインスタンス変数の初期化

分類Dev

インスタンス変数をクラスで初期化できないのはなぜですか?

Related 関連記事

  1. 1

    初期化ブロックvsコンストラクターvs変数初期化

  2. 2

    コンストラクターでの空のインスタンス変数の初期化

  3. 3

    メソッドによるJavaインスタンス変数の初期化

  4. 4

    Javaのコンストラクターでのクラス変数の初期化

  5. 5

    プライベートコンストラクターを持つクラスでの静的変数の初期化

  6. 6

    MvvmCrossセットアップインスタンスの初期化中のInvalidProgramException

  7. 7

    インスタンス変数の初期化に関して混乱

  8. 8

    インスタンス変数の初期化:慣用的な方法

  9. 9

    インターフェイスインスタンス変数の初期化

  10. 10

    プライベート変数を初期化する抽象クラスのFortranコンストラクター

  11. 11

    インスタンス変数は、各オブジェクトの初期化で同じです

  12. 12

    コンストラクターの実行順序/順序:関数内の静的変数(クラスインスタンス)の依存初期化

  13. 13

    暗黙的にインスタンス化された変数テンプレートの動的初期化の順序

  14. 14

    コンポーネントクラス変数の初期化

  15. 15

    マルチスレッドクライアントでのCOMオブジェクトの初期化とインスタンス化

  16. 16

    インスタンス化せずにプロトタイプのJavascriptアクセス変数

  17. 17

    静的アトミックメンバー変数を初期化します

  18. 18

    別のメソッドのコンストラクター内で最終変数を初期化します

  19. 19

    アトミックペアをインスタンス化できないのはなぜですか?

  20. 20

    2つのコンストラクタでfinal変数を初期化します

  21. 21

    PHP - 親変数の初期化 (コンストラクター付き)

  22. 22

    関数ポインタを使用したマップのリスト初期化を含むクラス

  23. 23

    クラスコンストラクターで初期化されたタイプのストリームのメンバー変数を使用できますか?

  24. 24

    Rubyクラスのインスタンス変数を別のクラスの新しいインスタンスに初期化する方法は?

  25. 25

    TYPO3RTEフォント/ cssはバックエンド設定(タイプミスとRTE初期化)に応じて変化します

  26. 26

    インスタンス変数初期化のスレッドセーフについて

  27. 27

    複数のインデックスでのNSMutableArrayの初期化

  28. 28

    Python:locals()を使用したプログラムによるクラスインスタンス変数の初期化

  29. 29

    インスタンス変数をクラスで初期化できないのはなぜですか?

ホットタグ

アーカイブ