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

    KAB-studio.h


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

    送信日： 2005/01/10(Mon) No.289
    配信数： 2016
    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
*/
////////////////////////////////////////////////////////////////////

/*                        新年の御挨拶                            */

　読者の皆様、あけましておめでとうございます。

　昨年は色々とお世話になりました。
　特に、個人的な話ですが１２月に体調を崩してしまい、その際にフォロー
して頂いた方々には心から御礼を申し上げます。その関係で、今年は職を変
えることになり、同時にコンテンツを充実していきたいと考えています。
　また、偶然にも今年は KAB-studio が始まって１０周年を迎える年にもな
ります。今年は KAB-studio の節目となる年になりそうです。

　今年こそは皆様の期待に応えられる内容を提供したいと考えておりますの
で、皆様、これからも応援よろしくお願いいたします！

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

・１月表紙壁紙！
　新年ということで新しい表紙壁紙です！！
　今月は小悪魔なハオシャオです。実は１年前の焼き直しですが（汗）。
　ダウンロードは CG Gallery にて。
[ CG Gallery ]
http://www.kab-studio.biz/CG/Gallery/index.html#KAB_studio_200501_1024

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

・特に更新なし……
　ごめんなさい、今週は特に更新ありません。
　ほとはーまわりは来週くらいには……。


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

2004/12/26 (Sun)
　めっさ。久々徹ゲーでナルトとイタスト。 NDS と PSP 。始発で帰って昼
１２時に寝てまったり。かぶろぐ版今年を振り返る。横浜でいっぱい買い
物。今年を振り返る、１２月。１２月は最悪だった。余談１、休学。余談２、
這ってでも。そしてクリスマスパーティー。

2004/12/27 (Mon)
　壊れました。寒気とか熱く感じたりとかの風邪っぽい症状が一日中。明日
病院行く予定。今日のことは堪えた……。思いの外弱かった。１２月初期か
らもう悪かった？　１歳半の時に生死の境を彷徨う。プラネテス９巻と
さとうきび畑の唄を見てぼろぼろ泣く。つか今の職場が戦争みたい。そして
納会。

2004/12/28 (Tue)
　７時半に起きてけいゆう病院に行くもえらい待って風邪薬もらって以上。
おなかヤバそう。症状変わらず。帰りに横浜へ。帰ってからは年賀状描いた
りMachician書いたり。くじアン面白かった。そして鬱病？　そして体が
資本。そして心と体。

2004/12/29 (Wed)
　症状がまだ残ってる……。絵を描きまくり。１月表紙壁紙、Machician
ヒロイン３人組の水着姿、Machician「セラフ」。げんしけんと版権。
そしてうつ病と講師職。

2004/12/30 (Thu)
　昨日はビデオのダビングしまくり。１０時半に起きてヨドバシで超硬買っ
て、それから冬コミへ。ビジュアルアーツとかガンスリ本とか石田あきら様
の本とか、あと申込書セットを購入。表紙壁紙は昔の絵を描き直す方針で。

2004/12/31 (Fri)
　１月表紙壁紙完成！　コンセプトは「小悪魔ハオシャオ」。去年の１月の
をベースに描き直したもの。今回かなりエロい。特に「泣き顔バージョン」
が。去年のと比べると全然違う……解像度と、髪や肌の質感が違う。今日は
１１時に起きてダビングとかバックアップとか。今年はいい年だった。来年
はとりあえずプー。最後のツッコミはプログラミングの楽しさ。

2005/01/01 (Sat)
（作者里帰りのためお休み）

2005/01/02 (Sun)
（作者里帰りのためお休み）

2005/01/03 (Mon)
　実家帰ってました。３１日、１日、２日について。これからの計画を親に
了承してもらいました。というわけで退職願もどきをメールで送信。さて、
どうなるか。明日働けるのか……。ツッコミｘ３。

2005/01/04 (Tue)
　体調最悪ながらもおしごと。仕事初めでのんびりして定時上がり。
ツッコミｘ４。

2005/01/05 (Wed)
　朝の寒いのが体に堪える……。勤務地のリーダーに説明。中間派遣Ｂ社の
人とのお話は……送別会のような感じに（汗）。ツッコミｘ８。

2005/01/06 (Thu)
　中間派遣Ｂ社の方が勤務地まで来てくれて、仕事が明日いっぱいに。交代
要員の難しさ。派遣先Ｃ社とは明日いっぱいになりました。今回の件が退職
に継ながる理由。そしてリンク間違い。そしてストレス。

2005/01/07 (Fri)
　おしごと最終日。現プロジェクトから抜けて、３時に派遣先Ｃ社の拠点
へ。ファイル置いて、荷物まとめて。本が重い。派遣先Ｃ社の３年半を振り
返る。最初の年はすごく無謀なことした。３年目のプロジェクトが一番感慨
深いかも。あとは派遣元Ａ社だけ。そして連絡つかない。

2005/01/08 (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.22
複数の同期オブジェクト

「今回は、まず前回の復習から」
『クリティカルセクションでデッドロック、だよね』
「クリティカルセクションに限らず、デッドロックが発生する条件っていう
のがあります」

・同期オブジェクト１、２が存在する。
・スレッド１、２が存在する。
・スレッド１は同期オブジェクト１にロックを掛けている間に
　同期オブジェクト２を待機する。
・スレッド２は同期オブジェクト２にロックを掛けている間に
　同期オブジェクト１を待機する。

「この条件だと、確率的にデッドロックが発生する可能性があります」
『確率的？』
「そう、この条件だと、デッドロックが発生するのは」

・スレッド１が同期オブジェクト１にロックを掛けて、
　同期オブジェクト２の待機を開始する前に、
　スレッド２が同期オブジェクト２のロックを掛ける。

「という場合。前回の例で言うと」

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

        TRACE( "IncrementThread1() 1 と 2 の間。\n" );
        // 0.1 秒待ちます。
// スレッド１がここで 0.1 秒待っている間に……
        Sleep( 100 );

        EnterCriticalSection( &g_stCriticalSection2 );

「で待っている間に」

// 別スレッドで呼び出される、 g_iData を増やし続ける関数。
void __cdecl IncrementThread2( void *p_p )
{
    TRACE( "スレッド開始。\n" );
    for( int iF1 = 0; iF1 < 10; ++iF1 )
    {
        EnterCriticalSection( &g_stCriticalSection2 );

        TRACE( "IncrementThread2() 2 と 1 の間。\n" );
        // 0.1 秒待ちます。
// スレッド２もここで待っていると……
        Sleep( 100 );

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

「にスレッド２が来ちゃうとデッドロックになります。で、重要なのは」

        Sleep( 100 );

「の箇所。これがなくて、処理がとても短い場合、つまり」

        EnterCriticalSection( &g_stCriticalSection1 );

「から」

        LeaveCriticalSection( &g_stCriticalSection1 );

「までの時間が非常に短い場合」

・スレッド１が同期オブジェクト１にロックを掛けて、
　同期オブジェクト２の待機を開始する前に、
　スレッド２が同期オブジェクト２のロックを掛ける。

「この条件の〈同期オブジェクト２の待機を開始する前〉に〈スレッド２が
同期オブジェクト２のロックを掛ける〉のが非常に難しくなります」
『そか、 Sleep() で待たないから、同期オブジェクト１にロックを掛けて
とっとと処理しちゃって同期オブジェクト２の待機もとっととしちゃう、と
〈その間に〉ってほとんどないんだね』
「そういうこと。だから、こういう場合には〈確率的に〉デッドロックが発
生することになります」
『運が悪ければ、ってことね』
「ただし！　基本的にこれはあってはいけません」
『んー、確かに使ってる人から見れば〈運が悪かった〉じゃ済まないよね』
「そういうこと。普通にプログラムを組んでいればデッドロックが発生する
確率は 0% 。これが 0.00000001% になっただけでもダメ」
『……そこまで厳しくする必要あるの？』
「それは処理や使い方によるもの。 0.00000001% の確率でも、その処理を
１秒間に１万回行ったら？　それを２４時間３６５日ずっと走らせたら？」
『うわ、絶対に発生するねそれ……』
「もちろんこういう使い方をしちゃいけない、って言うこともできるけど、
それよりは」
『ちゃんとデッドロックは潰した方がいい、ってことね』
「そういうこと」
『んー、質問！』
「はい火美ちゃん」
『デッドロックは〈複数の同期オブジェクトを使う〉と発生しちゃうんだよ
ね。なら一個だけにすればいいんじゃない？』
「そうできたら苦労しないんだけど……」
『できないの？』
「同期オブジェクトは、基本的に〈同期を取りたい対象につきひとつ〉必要
です。たとえば、前回の例での g_iData のような変数が３つあったら」
『同期オブジェクトが３つ必要……』
「ということになります。だから、同期オブジェクトを複数持つことは避け
られません」
『……じゃあさ、その３つの変数をひとつの同期オブジェクトでロック掛け
るってゆーのは？　たとえば……』

// 共有する変数。
int g_iData1 = 0;
int g_iData2 = 0;
int g_iData3 = 0;

『って変数がある時に』

void __cdecl IncrementThreadAll( void *p_p )
{
    TRACE( "スレッド開始。\n" );
    for( int iF1 = 0; iF1 < 10; ++iF1 )
    {
        // クリティカルセクションでロックを掛けます。
        EnterCriticalSection( &g_stCriticalSection );

        // g_iData1 への処理。
        // g_iData2 への処理。
        // g_iData3 への処理。

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

『みたいに、ひとつの排他処理の中で全部の処理しちゃうのはどうかな。
g_iData1 を使うときにロック掛けて、その間は g_iData2 や g_iData3 に
もアクセスできなくする、みたいに』
「それなら同期オブジェクトはひとつだからデッドロックは起きないけど、
処理にすごく時間が掛かるようになるよ」
『え？』
「 g_iData1 に対する処理をしている間、他のスレッドが g_iData2 や 
g_iData3 にアクセスしたら、そのスレッドは待機状態になっちゃうわけだ
から」
『 g_iData1 の処理が終わらない限り他のスレッドは止まったまま……それ
ってマルチスレッドの意味ないね』
「そういうこと。実際、同期の取り方は実行速度にとても影響します。前回
の例で、 EnterCriticalSection() と LeaveCriticalSection() の間の処理
がすごく時間の掛かる処理だったら」
『他のスレッドがその間待たなきゃいけない……』
「もし、そのすごく時間が掛かる処理が g_iData にまったく関係がなかっ
たら」
『げ、それって無駄！』
「そういうこと。だから、同期を取る、っていうのは必要最小限にする必要
があるんです」
『じゃ、これはダメなんだね……』
「ただ、こういうふうに処理しなきゃいけない場合もあるんです」
『え？』
「たとえば、 g_iData1 と g_iData2 の値を元に計算をして g_iData3 に結
果を入れる場合。この場合、 g_iData1 と g_iData2 のデータを〈同時に〉
取得する必要があります」
『同時？』
「 g_iData1 を取得して、そのあと g_iData2 を取得する前に、他のスレッ
ドが何か計算をして g_iData1 と g_iData2 を変えたりしたら、 g_iData1 
と g_iData2 を使って計算する意味がないでしょ」
『んー、違う計算結果だから、ってこと？』
「そういうこと。 g_iData1 と g_iData2 が計算結果としてペアなら、この
ふたつの整合性が取れてないと意味ないし、これに加えて g_iData3 も同じ
ような意味だったら……」
『…… g_iData1 の取得から g_iData3 の計算が終わるまでずっとロックを
掛けてなきゃいけない……』
「そういうこと」
『……なんか、すっごくめんどいね』
「実は面倒なんです。で、これはスレッドとか同期オブジェクトに限らな
い、テーマの大きい問題なので、ここでは深くは見ません」
『それってつまり、取り上げるとそれだけで１章とか使っちゃうレベルって
こと？』
「そういうこと。それに、作り方によってはこういうふうに複雑にしない方
法はいくらでもあるから」
『たとえば？』
「今の例だと、先に g_iData1 と g_iData2 、 g_iData3 のデータを取って
きて、それから処理する」
『あ……』
「データを取ってくるところだけロックを掛けて、取ってきたらそれで計
算、ってすればいいわけ」
『なんだ、そんないい方法があるんじゃない』
「ただ、それは変数のコピーが可能な場合。変数がクラスでコピーが難し
かったり、データの量が大きかったりすると」
『無理だね……』
「でも、どういう状況でも〈使わない方法〉はあるものだから、とりあえず
はそういう方向で見てみて」

/*
    Preview Next Story!
*/
『うわ、今回すっごくあいまい』
「ほんのさわりだからね。本質的にはすごく面倒な問題」
『うー、あんま扱いたくないね』
「そうもいかないんだけど、それはまた別のお話」
『ってことは次回は違う話？』
「次回は実用的な話」
『おお』
「というわけで次回」
＜ Version 14.23 メッセージの復習 ＞
『につづく！』
「そのまえにまずは復習」
『げげ』


////////////////////////////////////////////////////////////////////
/*                ２００５年１月１７日（月）の更新                */
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 - 2005 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz
*/
////////////////////////////////////////////////////////////////////

