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

    KAB-studio.h


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

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

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

・１２月表紙壁紙追加！
　毎月恒例（？）、新しい表紙壁紙です。
　今回はハオシャオのサンタさん……？
　ダウンロードは CG Gallery にて。
[ CG Gallery ]
http://www.kab-studio.biz/CG/Gallery/index.html#KAB_studio_200412_1024


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

2004/11/28 (Sun)
　アマゾンから届いたスライムコントローラーを受け取って、夕方まで種死
をがーっと見て、夕方に横浜に行ってコミックスとか色々購入。コミックス
が読み切れない……。帰ってからダビングして、そのあとほとはーを。そし
てきつくて死ねる。そして創作活動。

2004/11/29 (Mon)
　眠い、寒い、気持ち悪い、風邪かも。おしごとは Excel で VBA と、
QC７つ道具のお勉強。そしてガチャガチャの中身。そして機嫌の悪そうな
顔。

2004/11/30 (Tue)
　おしごとを休んだ。体調最悪モード。ぐだーっとしてマンガ読んだり。あ
と銀行に行ったりも。夢見まくり。ホットカーペットに寝たのが良くなかっ
た？　それとも水分の取りすぎ？　体が少しずつ壊れていく……。そして
有給休暇の前借り。そしてベッド。

2004/12/01 (Wed)
　DWH を作り直し。１１月は後ろ向きだった。体力は回復しました。１ヶ月
くらい休みたいなぁ。そしてブロガー。

2004/12/02 (Thu)
　かなりダウナー。別に何もないんだけど、アドバンテージを生かせなく
て。初心に返る。１０階プロジェクトも関わっててややこしいことに……。
そして有休速攻でなくなる……。そして以下略。

2004/12/03 (Fri)
　SQL 叩いてテストデータ抜き出し。簡単そうで……。土日は休めます。そ
して変なプロジェクト。そしてかまってあげないと。

2004/12/04 (Sat)
　１２月表紙壁紙完成〜。ハオシャオのサンタさん……？　全体的にはいい
けど詰められる部分は結構あるなぁ……。そして業務。そして枕。


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

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

「うわ、これはちょっと……」
　更衣室。特殊素材でできたスーツを見る。ゴムのような質感、水着のよう
な感覚。
「体のライン、出ちゃいますよね」
「くっきりはっきりとね」
　智子も一度着たことがあったが、その姿はとても口にはできない。
「リシュネ達は気にしないけど」
「リシュネは――」
　言いかけた言葉を飲み込む。
「……リシュネとならいいけど、今日は木村君とか見てるし……これはやめ
ておきます」
「じゃあこれ」
　智子が黒いトレーニングウェアを渡す。
「うん、これなら水に掛かっても透けないし、いいかな」
　見切りを付けて服を脱ぐ舞。智子は部屋を出ようとして、足を止める。
「……その傷は？」
　体全体を覆う無数の傷。それは薄く消えかかっているとはいえ、数は尋常
ではない。
「あ、これですか？　練習でついちゃうんです。たとえば……」
　シャワー室へと歩き、おもむろに栓を開く。頭上から吹き出すはずの水は
螺旋を描いて舞の体を縄のように取り巻いていく。
「碧き泉の能力……」
「こうやって、体のすぐそばを高速で走らせるんです」
　高周波。
　ウィウィウィウィという空気を震わす音と共に、水帯が皮膚すれすれを走
る。まるで幅広の布が舞の体を包みつつ巡るように、水の帯が駆けめぐって
いく。
「私が動かしても」
　手を動かすとそれに水が追従する。
「ちゃんとそれに合わせて動くように、っていう練習をするんですけど」
　その右腕をよけるように水が走る。露わになった右腕には、無数の赤い
線、滴る血。
「あ……」
「でもこれ、簡単に直せるんです。細胞を活発にさせるっていう感じなんで
すけど」
　左手の指で傷をなぞると、その傷が治る。
「治癒能力……」
「全部消すのも面倒だし、私が下手な証だから、残しとこうと思って」
　栓を閉めると水の流れは途絶え、水の帯が排水溝へと走っていく。
「それが、その傷の原因というわけね……」
　智子は、その複雑な表情に、感情の高ぶりを抑え込むことで精一杯だっ
た。
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
「ん……王子は、うめのどんなとこが好きなの？」
「優しいところ。前向きなところ。温かいところ。一緒にいて落ち着きます」
「なるほど、似たものどうしってところかもね」
　たぶん、違うけど。

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.18
クリティカルセクションを使おう！

「前回は、グローバル変数にメインスレッドとサブスレッドからアクセスす
る例を見てみました」
『結構簡単にできたね』
「そこが危険」
『え”』
「 Version 14.01 ( No.268 ) でやったでしょ、同期を取らなきゃいけない
っていう話」
『そういえば、同期を取らないと……』

杵Ａが叩く
杵Ｂが叩く
おもちをこねる
杵Ｂが叩く
杵Ａが叩く
おもちをこねる
おもちをこねる
杵Ａが手を叩く

『ってなっちゃうんだよね』
「そういうこと。実際にこれをプログラムで見てみます」

// 共有する変数。
int g_iData = 0;

// 別スレッドで呼び出される、 g_iData を増やし続ける関数。
void __cdecl IncrementThread( void *p_p )
{
    TRACE( "スレッド開始。\n" );
    for( int iF1 = 0; iF1 < 10; ++iF1 )
    {
        int i = g_iData;
        // 0.1 秒待ちます。
        Sleep( 100 );
        g_iData = i + 1;
        TRACE( "%d\n", g_iData );
    }
    TRACE( "スレッド終了。\n" );
}


// IncrementThread() を別スレッドとして呼び出す関数。
// この関数をボタンのイベントハンドラとかで呼んでください。
void CallThread()
{
    HANDLE hThreadAry[3];
    hThreadAry[0]
        = (HANDLE)_beginthread( IncrementThread, 0, NULL );

    hThreadAry[1]
        = (HANDLE)_beginthread( IncrementThread, 0, NULL );

    hThreadAry[2]
        = (HANDLE)_beginthread( IncrementThread, 0, NULL );

    WaitForMultipleObjects( 3, hThreadAry, TRUE, 100 * 1000 );

    TRACE( "処理完了。\n" );
    TRACE( "%d\n", g_iData );
}

「これは、 g_iData を増やし続ける IncrementThread() 関数を別スレッド
で３つ同時に実行する例」
『 10 回ループしてるんだね。 1 回につき 1 増えて、ループは 10 回、
スレッドは３つ、ってことは 30 になるってことだよね』
「ところがそうならないんです」

処理完了。
10

『あれ？　 10 って……あ、これがさっきの同期取ってないってゆーのの問
題？』
「そういうこと。問題はここ」

        int i = g_iData;
        // 0.1 秒待ちます。
        Sleep( 100 );
        g_iData = i + 1;

「まず、 g_iData から i に値をコピーして、 0.1 秒待ってから、 1 増や
して、それをまた g_iData に入れます」
『それがまずいの？』
「３つのスレッドが同時にアクセスしちゃうからね。たとえばスレッド１が 
g_iData から i にコピーしたとき、 i が 1 だったとします」
『うん』
「次に、このスレッド１が g_iData に i + 1 を入れる前に、スレッド２が 
g_iData から i にコピーしたら？」
『 1 のまま……あ。スレッド１が g_iData に i + 1 を入れて、 g_iData 
は 2 、だけど、スレッド２も同じ事をするから……』
「 g_iData はまた 2 が上書きされちゃうんです」
『げげげ』
「これを表にしてみると……」

g_iData   スレッド１        スレッド２        スレッド３
1         i = g_iData                     
1         i : 1             i = g_iData       
1         i : 1             i : 1             i = g_iData
2 ←←←←g_iData = i + 1   i : 1             i : 1
2 ←←←←←←←←←←←←←g_iData = i + 1   i : 1
2 ←←←←←←←←←←←←←←←←←←←←←←g_iData = i + 1

「という感じになります」
『あれ？　そういえばこれってどっかで……』
「 Version 14.02 ( No.269 ) でしょ」
『あ、そうそう。そっか、あのときはファイルだったけど、今回はメモリの
中の話なんだね』
「そういうこと。同期とか排他処理とか、そういう観点では同じ。ファイル
でも変数でも〈取得・編集・書き込み〉っていう流れがある場合には、この
流れ全体を排他する必要があるわけです」
『そうしないと、編集してる間に他が取得して、結果が変わっちゃうわけ
ね……』
「そこで、今回は最後の同期オブジェクト【クリティカルセクション】を
使ってみます」

クリティカルセクション （ Critical Section ）

『お、やっとだね』
「クリティカルセクションは他の同期オブジェクトとかなり性質が異なりま
す」

・名前を持たない
・ひとつのプロセスの中だけで機能する
・シグナルを使わない
・WaitForSingleObject() 系関数を使わない

『なんか全然別物って感じが……』
「そう、だから一番最後にしたっていうのもあるかな。でも、使いやすいか
も」
『使いやすい？』
「考え方は違うけど、ちょっと使ってみればわかると思うよ」

// 共有する変数。
int g_iData = 0;

// クリティカルセクション用同期オブジェクト。
CRITICAL_SECTION 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" );
}


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

    HANDLE hThreadAry[3];
    hThreadAry[0]
        = (HANDLE)_beginthread( IncrementThread, 0, NULL );

    hThreadAry[1]
        = (HANDLE)_beginthread( IncrementThread, 0, NULL );

    hThreadAry[2]
        = (HANDLE)_beginthread( IncrementThread, 0, NULL );

    WaitForMultipleObjects( 3, hThreadAry, TRUE, 100 * 1000 );

    TRACE( "処理完了。\n" );
    TRACE( "%d\n", g_iData );

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

『あれ？　他の同期オブジェクトみたいに関数いっぱいないんだ、ってゆー
かさっきのプログラムと似てるね』
「さっきのプログラムの改善版だからね。変わったのは」

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

「が追加されて、このクリティカルセクション用同期オブジェクトを使う
４つの API を呼び出すようにした、っていうところかな。とりあえず試し
てみて」
『ほい。あ、ちゃんと 30 ってなった！！』
「というわけで次回に続く」

/*
    Preview Next Story!
*/
『でも他の同期オブジェクトとぜんっぜん違うね』
「同期オブジェクトって考えない方がいいかも」
『じゃあ同期オブジェクトじゃないんじゃない』
「でも同期オブジェクトなんです」
『わけわかんない』
「というわけで次回」
＜ Version 14.19 クリティカルセクションを使ってみる！ ＞
『につづく！』
「新しい気持ちで、でも他の同期オブジェクトのことは踏まえて」
『よけいわかんない』


////////////////////////////////////////////////////////////////////
/*                ２００４年１２月１３日（月）の更新              */
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
*/
////////////////////////////////////////////////////////////////////

