プログラム言語

ce4f5a2d :Anonymous 2009-11-12 20:08
>>e9c543ce

俺の妄想だが……

スレッドの処理が副作用を伴わなければ、クリティカルセクションはなくせるはずだ。

非同期に呼び出された関数は何も返さない。呼び出し元のスコープ内で確保したオブジェクトを書き変えさせることで、呼び出し元はスレッドから結果を受け取る。結果を受け取るためのオブジェクトと排他制御のためのオブジェクトが必要だ。排他制御は呼び出し元や他のスレッドを待たせる。これはなるべく避けたい。

引数を渡す時に呼び出す関数と、結果を受け取るときに呼び出す関数を1つのセットで定義できれば、副作用を排除できる。

 int Receive() & async Send(int x){
  return Hoge(x);
 }

Send()で引数を値で渡し、Receive()でスレッドの終了を待って結果を受け取る。スコープ外で確保されたオブジェクトを上書きしないので、排他制御はいらない。

後は、待たないという選択肢だが、Nullable型を使うのはどうだろうか?

 int Receive() & int? MayReceive() & async Send(int x){
  return Hoge(x);
 }

スレッドの処理が終了していなければ、MayReceive()はnullを返し、スレッドの処理が終了していれば、MayReceive()はint型の値を返す。
Powered by shinGETsu.