////////////////////////////////////////////////////////////////////
/*

    KAB-studio.h


    (C)KAB-studio 1999 - 2004 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz

    送信日： 2004/12/13(Mon) No.286
    配信数： 2032
    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
*/
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
/*                ２００４年１２月１３日（月）の更新              */
http://www.kab-studio.biz/index.html

・風邪でお休み
　ごめんなさい、風邪ひいて色々お休み……。


////////////////////////////////////////////////////////////////////
/*                        ちょお普通な日記                        */
http://www.kab-studio.biz/nikki2/index.html

2004/12/05 (Sun)
　表紙壁紙にロゴを入れたりその他諸々。昨日表紙壁紙描いて疲れた……。
プログラミングよりずっと疲れる。となグラ！購入。なんか日曜は憂鬱だ
……。

2004/12/06 (Mon)
　テストをこつこつと。ポジション的に微妙。プリキュアが気合い入って
た。そしてサザエさん症候群。そしてミーティング。

2004/12/07 (Tue)
　疲れる理由がないのに疲れる。家帰ったらさらに……。１４日に有休取
得。年末年始は１２月２９日〜１月３日。そして等幅フォント。

2004/12/08 (Wed)
　テスト、テスト、テスト。急遽１０階プロジェクトに。崩れかけ。そし
て２９日。そしてインフルエンザ。

2004/12/09 (Thu)
　午前中は１０階プロジェクト、午後は１７階プロジェクト。統計の数学を
久しぶりに勉強。そして６時間。そしてツッコミ返しポイント。

2004/12/10 (Fri)
　酷い風邪をひく。足が痛い……。レビューは予想とだいぶ違ってい
た……。レビュー中もテンパってたし。あらゆる面でいっぱいいっぱい。そ
して休憩時間。

2004/12/11 (Sat)
　風邪はほぼ治った。今日１日は熱出てたけど。課題夢を見なかったのが助
かった……。転職難しい？　精神的にまいってる。仕事場に合わない。でも
乗り越えないと。３月一杯で辞める。ちょうど切りがいいんで。リスクもあ
るけど。自殺はしないです。そしてアクエリアス。そして社会人歴。


////////////////////////////////////////////////////////////////////
/*                         風雅、舞い                             */
http://www.kab-studio.biz/Novel/Fuga/index.html

■　第十一章　ファインダウト社　−１３−

「ひゃー、広いねー」
　まわりを白が囲む、タマネギ型の空間。見上げる先には張り出した部屋と
その一面に張られた窓、その奥に立つ美咲、俊雄、恭子、智子の姿が見え
る。手を振れば、ちゃんと振り替えしてくる。
「ここでいいですか？」
「あ、……あ、うん」
　少年がたっぷりと水の入ったバケツをふたつ床に置く。先ほど見た特殊素
材のスーツを着て。
　……微妙に盛り上がった箇所が微妙に気になる……。
『これから模擬戦を行います』
　スピーカーから聞こえる智子の声。
『５分間の試合を３回行います。インターバルは１分。それでいい？』
「はい」
　舞の目が本気になる。口元には笑み。
「あなた、回復能力はありますか？」
「あ……」
　そうストレートに訊かれては、正直に答えるしかない。
「はっきり言って人並み。雅樹みたいな不老不死の能力はないし、ちょっと
した傷を回復できる程度」
「……何を困っているんですか？」
「手加減、する気でしょ」
「もち――」
　目にも止まらぬ速さで跳ね
「――ろッ！？」
　舞の左脇へと入り込もうとして跳び退く。手には無数の傷、その多くが筋
肉まで達している。
「……」
「これで手加減必要ないってわかったよね」
　舞と少年の間に、水がたゆたっている。
「……僕の肌がこう易々と……」
「硬質化した状態はリシュネに見せてもらったから、どのくらいの切れ味が
あればいいかはわかってたからね」
「だとしても、全方位をカバー仕切れるわけないでしょう。なぜカウンター
を当てられたんです？」
「私は水の能力を持つんだもの。空気中の水蒸気も、あなた自身が持つ水分
も、空間的に把握できる。それは、見るよりもずっと速くて正確」
「なるほど」
「じゃ、今度はこっちから行くから。手加減しないからね」
　バケツから登る水溜が、顎を開いた。
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]

「あ、まだ王子様には言ってなかったかしら。私、APなんです」
「AP……」

Machician 第３話 好きとスキと 好評連載中！
[ Machician ]
http://d.hatena.ne.jp/kab_studio/20040823#1093276416
[ Machician＋設定 最新一覧 ]
http://d.hatena.ne.jp/kab_studio/searchdiary?word=*%5BMachician
_______________________________________________________________[KCM]

////////////////////////////////////////////////////////////////////
/*                       #pragma twice                            */
http://www.kab-studio.biz/Programing/PragmaTwice/index.html

　Version 14.19
クリティカルセクションを使ってみる！

「というわけで今回は、前回の続き、クリティカルセクションについてもう
少し詳しく見てみます」
『ただコード見ただけだったもんね』
「そうだね、まずはそのコードを追うところから。まず、クリティカル
セクション用同期オブジェクトも、他の同期オブジェクトと同じように、
グローバル変数で持つことにします」

// クリティカルセクション用同期オブジェクト。
CRITICAL_SECTION g_stCriticalSection;

『でもハンドルじゃないよ』
「そう、クリティカルセクション用の同期オブジェクトはハンドルじゃない
んです」
『なんかここから違う……』
「次に、この変数の初期化と解放」

// IncrementThread() を別スレッドとして呼び出す関数。
// この関数をボタンのイベントハンドラとかで呼んでください。
void CallThread()
{
    // クリティカルセクションを初期化します。
    InitializeCriticalSection( &g_stCriticalSection );

//  スレッド呼び出しと待機処理。

    // クリティカルセクションを削除します。
    DeleteCriticalSection( &g_stCriticalSection );
}

「 API の InitializeCriticalSection() で初期化して、 
DeleteCriticalSection() で解放します」
『これもハンドル受け取ったりしないんだね……』
「それに、名前も渡してないでしょ」
『ホントだ！　同期オブジェクトって言ったら名前で識別するもんなのに』
「クリティカルセクションはプロセスの中だけだから」
『どゆこと？』
「他の同期オブジェクトは複数のプロセスからアクセスできるわけだけど、
そのためには名前が必要でしょ。ハンドルを HANDLE 型の変数に入れても、
他のプロセスからは見られないんだから」
『あ、そっか、メモリ別だから……クリティカルセクションは同じプロセス
の中でしか使えない、だから逆にメモリは全部共有……』
「 g_stCriticalSection はプログラムのどこからでもアクセスできるから
ね。まぁ、この初期化と削除は特にたいしたことはしてないから、次の一番
重要な部分を見てみます」

// 別スレッドで呼び出される、 g_iData を増やし続ける関数。
void __cdecl IncrementThread( void *p_p )
{
    TRACE( "スレッド開始。\n" );
    for( int iF1 = 0; iF1 < 10; ++iF1 )
    {
        // クリティカルセクションでロックを掛けます。
        EnterCriticalSection( &g_stCriticalSection );

        int i = g_iData;
        // 0.1 秒待ちます。
        Sleep( 100 );
        g_iData = i + 1;
        TRACE( "%d\n", g_iData );

        // クリティカルセクションのロックを解除します。
        LeaveCriticalSection( &g_stCriticalSection );
    }
    TRACE( "スレッド終了。\n" );
}

『これって、前の時に比べて』

        // クリティカルセクションでロックを掛けます。
        EnterCriticalSection( &g_stCriticalSection );

『と』

        // クリティカルセクションのロックを解除します。
        LeaveCriticalSection( &g_stCriticalSection );

『が追加されたんだよね』
「そう。このふたつはペアで使います。まず、クリティカルセクションには
【コードを排他する】という概念があります」
『コードを排他？』
「このふたつで挟まれた範囲のコード、つまり」

        // クリティカルセクションでロックを掛けます。
        EnterCriticalSection( &g_stCriticalSection );
// ↓ここから
        int i = g_iData;
        // 0.1 秒待ちます。
        Sleep( 100 );
        g_iData = i + 1;
        TRACE( "%d\n", g_iData );
// ↑ここまで
        // クリティカルセクションのロックを解除します。
        LeaveCriticalSection( &g_stCriticalSection );

「は、クリティカルセクションによって排他されます」
『排他……ってことは、ひとつがアクセスしてたら、他がアクセスできなく
なる、ってこと？』
「そう、 Version 14.03 ( No.270 ) のファイルの排他処理とかと同じ意味
の排他。このふたつの API 、 EnterCriticalSection() と 
LeaveCriticalSection() で囲まれた間のコードは、たったひとつのスレッド
だけが実行できます」
『たったひとつのスレッドだけ？』
「そう。たとえばスレッド１がこの処理を実行しようとしたとします」

// ※↓スレッド１進行中↓
        // クリティカルセクションでロックを掛けます。
        EnterCriticalSection( &g_stCriticalSection );

「スレッド１が EnterCriticalSection() を呼び出すと、ロックがかかりま
す」

        // クリティカルセクションでロックを掛けます。
        EnterCriticalSection( &g_stCriticalSection );
// ※↓スレッド１進行中↓
// ロックがかかりました。

「ここに、スレッド２が来たとします」

// ※↓スレッド２進行中↓
        // クリティカルセクションでロックを掛けます。
        EnterCriticalSection( &g_stCriticalSection );

// ※↓スレッド１進行中↓
        int i = g_iData;
        // 0.1 秒待ちます。
        Sleep( 100 );

「ところが、スレッド１がロックを掛けているのでスレッド２はここで足止
めとなります」

// ※↓スレッド２進行中↓
// ロックが掛かっているのでここで止まります。
        // クリティカルセクションでロックを掛けます。
        EnterCriticalSection( &g_stCriticalSection );

        int i = g_iData;
        // 0.1 秒待ちます。
// ※↓スレッド１進行中↓
        Sleep( 100 );

「その間、スレッド１は処理をするわけです」
『スレッド２が入れない間に処理をしちゃうわけね』
「そういうこと。で、ロックが外れるのが、 LeaveCriticalSection() を呼
び出した時」

// ※↓スレッド２進行中↓
// ロックが解除されました。
        // クリティカルセクションでロックを掛けます。
        EnterCriticalSection( &g_stCriticalSection );

        int i = g_iData;
        // 0.1 秒待ちます。
        Sleep( 100 );
        g_iData = i + 1;
        TRACE( "%d\n", g_iData );

        // クリティカルセクションのロックを解除します。
        LeaveCriticalSection( &g_stCriticalSection );
// ※↓スレッド１進行中↓
// ロックを解除しました。

「ロックが解除されると、スレッド２が入ることができます」

        // クリティカルセクションでロックを掛けます。
        EnterCriticalSection( &g_stCriticalSection );
// ※↓スレッド２進行中↓
        int i = g_iData;
        // 0.1 秒待ちます。
        Sleep( 100 );
        g_iData = i + 1;
        TRACE( "%d\n", g_iData );

        // クリティカルセクションのロックを解除します。
        LeaveCriticalSection( &g_stCriticalSection );

// ※↓スレッド１進行中↓

「こうして、 EnterCriticalSection() と LeaveCriticalSection() で挟ん
だ間は、ひとつのスレッドだけが入れるようになるわけです」
『これが、コードに排他処理が掛かる、って意味なのね。……質問！』
「はい火美ちゃん」
『スレッド３があったら？』
「スレッド２と同じく待ちます」

// ※↓スレッド３進行中↓
// ロックが掛かっているのでここで止まります。
// ※↓スレッド２進行中↓
// ロックが掛かっているのでここで止まります。
        // クリティカルセクションでロックを掛けます。
        EnterCriticalSection( &g_stCriticalSection );

「ロックが解除されたら、先に来たスレッドだけ中に入って、その先に来た
スレッドがロックを掛けちゃうから、後に来た方はまた止まります」

// ※↓スレッド３進行中↓
// ロックが掛かっているのでここで止まります。
        // クリティカルセクションでロックを掛けます。
        EnterCriticalSection( &g_stCriticalSection );
// ※↓スレッド２進行中↓
// ロックがかかりました。

『なるほど、スレッドがいっぱいあっても結局入れるのはひとつだけなの
ね』
「そういうこと」

/*
    Preview Next Story!
*/
『ホントにだいぶ違うね、他の同期オブジェクトと』
「シグナルとか関係ないからわかりやすいでしょ」
『ってゆーか別物。だから逆にわかりにくいかも』
「確かに……まぁ、他の同期オブジェクトと同じ所もあるんだけど」
『たとえば？』
「というわけで次回」
＜ Version 14.20 クリティカルセクションと同期オブジェクト ＞
『につづく！』
「たとえばデッドロック起こせたりとか」
『げ』


////////////////////////////////////////////////////////////////////
/*                ２００４年１２月２０日（月）の更新              */
http://www.kab-studio.biz/index.html

・ほとはー新展開？
　三人合体ホットハーブ、例の計画を実行するかも？


////////////////////////////////////////////////////////////////////
/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www.kab-studio.biz/nikki2/
・購読登録を解除したいときにはこのページで行なってください。
http://www.mag2.com/m/0000012198.htm
・解除は自分で行なってください。
・バックナンバーはこれらのページにあります。
http://backno.mag2.com/reader/Back?id=0000012198
http://www.kab-studio.biz/Freeware/index.html#MailMagazine


////////////////////////////////////////////////////////////////////
/*
    KAB-studio.h
      Weekly Mail Magazine.
      Written by Kaburaya Seiden.
      http://www.kab-studio.biz/Info/MailMagazine/

    (C)KAB-studio 1999 - 2004 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz
*/
////////////////////////////////////////////////////////////////////

