思うだけで学ばない日記 2.0

思うだけで学ばない日記から移転しました☆!よろしくお願いします。

C#でマルチスレッド[補足およびおおよそ解決編]

いや上の問題(別のスレッドにデータを渡す)について世間的に行われている方法について基本的なのを2点忘れてた;
5. スレッド生成時にパラメータを渡すインターフェースが通常あるからそれを使ってXを渡す
6. スレッドに渡す直前にオブジェクトXを生成して渡し、渡し元ではXのことは忘れる
しかしこれらはimmutableなオブジェクトを渡せ、というのと大して変わらないか、さもなくば問題の解決にならない。
まず5.については、スレッド起動「後」にXの内容を変更したくなったとき、Xの渡し元でXへの参照を保持しておいて変更する必要がある。immutableでないオブジェクトXを2つ以上のスレッドで保持し続ける、という話になるから元と大して変わらない。
6.については、オブジェクトXにきちんとコピーコンストラクタが実装されているなら可能性はある。スレッドB起動時もスレッドB起動「後」にXの内容を変更したくなった場合も、どちらであってもスレッドAでXのコピーX'をコピーコンストラクタで新規生成してスレッドBに渡し、直後AはX'の存在を忘れる、ということができる。
しかしXのメンバとそのサブメンバとそのサブサブメンバ…の全てについてディープコピーとしてのコピーコンストラクタがきちんと実装されている必要があり、さもなくば(同一オブジェクトへの参照が変更されないようなコピーコンストラクタ実装が紛れ込んでいると)やはり本質的にはここまで述べてきた問題が解決せず、爆弾を抱え込むことになる。
<結論>
スレッド間を渡すデータは極力単純なオブジェクトにしてコピーコンストラクタでコピーして渡そう。データの単純さの基準はコピーコンストラクタがディープコピーであるか、そう見なしても全く安全であることを確実に保証できるぐらい単純である必要がある。
でも今更変更し難いコードがあるのよねん、、