スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#による並行プログラミング入門 (6) 排他的アクセス(2) lock

 今回はlockによる排他処理を説明します。 
 
F#ではlockは 
 
lock : 'Lock -> (unit -> 'T) -> 'T (requires reference type) 
 
というシグネチャーで定義されています。 
 
lock lockObject actionという形で使います。 
actionはunit->'T型の関数 
この関数のbody部分をクリティカル セクション(critical code section)と呼びます。criticalは「危険な」という意味で、ここに他のスレッドから同時に使われては困る部分を書きます。 
オブジェクトは参照型のオブジェクトなら何でもよいのですが、通常は専用のオブジェクトを用意します。 
どれかのスレッドがlock以下の部分を実行するときは、まずオブジェクトをロックしてから関数のbody部分を実行し、それからオブジェクトを解放します。この間他のスレッドから関数を実行しようとしても、オブジェクトのロックが解除されるまで実行がブロックされます。 
このような仕組みでクリティカル セクションは一つのスレッドからしか実行できなくなります。 
つまり複数のスレッドから同時に関数を呼び出しても、関数が実行されるのは1つずつということになります。(同時には実行できない。) 
 
 
では例を一つ。 
 
> let sumData1 = ref 0 
let lockObjForSumData1 = new obj();; 
 
val sumData1 : int ref = {contents = 0;} 
val lockObjForSumData1 : obj 
 
> Parallel.For(1,101,(fun i  ->Thread.Sleep(10); 
                             lock(lockObjForSumData1) 
                                 (fun () -> sumData1:= !sumData1 + i)));; 
val it : ParallelLoopResult = 
  System.Threading.Tasks.ParallelLoopResult {IsCompleted = true; 
                                             LowestBreakIteration = null;} 
> sumData1;; 
val it : int ref = {contents = 5050;} 
 
(参考)lockはMonitorクラスを用いて実行されています。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

クリティカル

私の中では「いっぱいいっぱい」って感じですかね。
危険という場合には、余裕がない・限界一杯だから危険という感じなんじゃないでしょうか。
プログラム分野でクリティカルコードといえば、
危険なコードというより、この範囲のコードを実行する場合他の処理をやる余裕が無い(例えば割り込みされては困るので、1マシンコードで実行するようなコード)という意味かと思います。

シグネチャ

同じ事なんだけど、
インテリセンスでは、先述のように表示されるが、
インタラクティブウインドウでは、
('a -> (unit -> 'b) -> 'b) when 'a : not struct
のように表示される
インテリセンスの表示
'T (requires reference type)
だと、
'Tが参照型みたいで紛らわしい。

No title

BLUEPIXYさん、コメントありがとうございます。あけましておめでとうございます。
シグネチャについては、確かにF# Interctiveが吐き出す分の方がよいですね。(私のはMSDNからのコピー)
Cirticalについては、ググってみたら、次の様に書いてありました。
A critical code section is a piece of software that must be executed atomically to preserve data integrity, hardware integrity, and access serialization.
プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。