sharedをつけてもいい場合
- キャスト以降は共有資源として扱う
- キャスト以降も単一のスレッドからしか触らないデータである
sharedをつけるということは、共有資源にする場合です。
共有資源であることが明らかである場合、cast(shared)とすることでsharedをつけることができます。
共有資源であるということは、時系列的に見てcast(shared)した瞬間からその変数のアクセスはすべて共有資源に対する取り扱いをしなければなりません。
また、例外的に単一のスレッドからしか触らないことが明らかな場合でも、sharedをつけることによる弊害はありません。しかしながら、これをやる利点は後述するsharedメンバ関数が呼べる、という程度ですので、必要かどうか十分考えてから行いましょう。
auto sobj = cast(shared)obj;
sharedを外してもいい場合
- キャスト以降は単一のスレッドからしか触らないデータである
- キャストするのがクリティカルセクション内である
sharedを外すということは、付ける場合とは逆に、スレッドローカルなデータになるということです。
スレッドローカルなデータは、単一のスレッドからしかアクセスすることが許されないデータです。
cast()を行うことでsharedを取り外すことができますが、それ以降は単一のスレッドでしか触らないようにしましょう。
そのデータに対するクリティカルセクション内では、限定的にこれが許されますが、クリティカルセクションを抜けた瞬間に「sharedをつけてもいい場合」の条件を満たすようにする必要があります。
auto obj = cast()sobj;
スレッドローカルなオブジェクトのsharedメンバ関数を呼びたい場合
これは、「sharedをつけてもいい場合」と条件は同じで、cast(shared)すればいいです。
(cast(shared)obj).foo();
共有資源のオブジェクトのsharedじゃないメンバ関数を呼びたい場合
これは、「sharedを外してもいい場合」と条件は同じでで、cast()すればいいです。
auto str = (cast()sobj).toString();