<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>すいません、VB４しかやってないんです、VBAはやったけど（ぼそ）</title><link>http://blogs.wankuma.com/esten/</link><description>なのに．NETですか？　あやしいジャンガリアンベムスターがさすらうゴシックペナルティ</description><managingEditor>片桐　継（Tugu Katagiri）</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>年末年始のご挨拶</title><link>http://blogs.wankuma.com/esten/archive/2008/12/31/165329.aspx</link><pubDate>Wed, 31 Dec 2008 18:43:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2008/12/31/165329.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/165329.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2008/12/31/165329.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/165329.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/165329.aspx</trackback:ping><description>&lt;p&gt;片桐です。&lt;/p&gt; &lt;p&gt;&lt;font color="#008000"&gt;&lt;strong&gt;今年は色々と公私ともにお世話になりました。&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#008000"&gt;&lt;strong&gt;ほんと、激動の一年＜大げさ　でした。&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font color="#008000"&gt;&lt;strong&gt;来年もよろしくお願いします。&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;で、最近頑張ってみた写真を貼ってみます。FinePixの古いやつですけど。&lt;/p&gt; &lt;p&gt;デジ一眼が本当に普及している昨今ですが、今だ小さいデジカメでも頑張れるよー、と。&lt;/p&gt; &lt;p&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="219" alt="upa" src="http://esten.cside.com/img/348a55d20c91_10738/upa.jpg" width="290" border="0"&gt; &lt;/p&gt; &lt;p&gt;うちのウーパールーパー（アホロートル・マーブル）、名前はまーくん、２歳になります。&lt;/p&gt; &lt;p&gt;元々は厳しい自然環境で生き抜く為にあえて変態することを捨て、両生類の幼体の姿で一生を終えるウーパールーパーはある意味究極のアダルトチルドレンだとも思うのですが＜違っ&lt;/p&gt; &lt;p&gt;この哀愁の背中？　いえ、来年にむけて決意新たな背中、と見ていただければ幸いです。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/165329.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>創世のカタギリオン（年内納品、がんばってみたけど子羊がバグ出しちゃった Ver.）</title><link>http://blogs.wankuma.com/esten/archive/2008/12/27/165144.aspx</link><pubDate>Sat, 27 Dec 2008 22:13:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2008/12/27/165144.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/165144.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2008/12/27/165144.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/165144.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/165144.aspx</trackback:ping><description>&lt;p&gt;開発の始まりの日　画面の窓の中で　．NETのコード　多い残業一人で強いた &lt;p&gt;やりたいこと全て　やりたいもの全て　理不尽な仕様　できるわけねぇ　あきらめたいよ  &lt;p&gt;&amp;nbsp; &lt;p&gt;一般をしのぐ怒涛の作業　出会わなければ確実に暇でいられた  &lt;p&gt;クエリのチューニングばかりやって　プログラム打ち続け　処理早くするため　組まれてきた  &lt;p&gt;&amp;nbsp; &lt;p&gt;一万件と二千件あっても　動いてる  &lt;p&gt;八千件すぎた頃からちょっと処理遅くなった  &lt;p&gt;一億と二千件あっても　動いてる  &lt;p&gt;&amp;nbsp; &lt;p&gt;それをやったその日から僕の地獄に音楽は絶えない  &lt;p&gt;&amp;nbsp; &lt;p&gt;開発終わる前に　いのちが終わる前に  &lt;p&gt;作る嘆きほどいて　定時帰り　始めてたいよ  &lt;p&gt;&amp;nbsp; &lt;p&gt;危機せまり　納期超えの記憶  &lt;p&gt;失意に呑まれ　立ち尽くす　狂おしき日々  &lt;p&gt;&amp;nbsp; &lt;p&gt;よみがえれ　永遠（とわ）に動くサーバー  &lt;p&gt;とまらないでプログラム  &lt;p&gt;祈り宿しながら納めてきた  &lt;p&gt;&amp;nbsp; &lt;p&gt;一万件と二千件あっても　動かない &lt;p&gt;八千件すぎた頃からちょっと処理怪しくなった  &lt;p&gt;一億と二千件あったら動かない &lt;p&gt;それをやったその日から僕の地獄に音楽は絶えない &lt;p&gt;（Wow……このバグ何？）&amp;nbsp; &lt;p&gt;&amp;nbsp; &lt;p&gt;僕は繰り返しバグ取りやって  &lt;p&gt;何度も何度もテストもやって  &lt;p&gt;帰れない僕が眠れない僕がクシャクシャになったとしても  &lt;p&gt;Uu....帰りたい.....  &lt;p&gt;人並みに生きるために……  &lt;p&gt;&amp;nbsp; &lt;p&gt;一万件と二千件あっても　動いてる  &lt;p&gt;八千件すぎた頃からちょっと処理遅くなった  &lt;p&gt;一億と二千件あっても　動いてる  &lt;p&gt;&amp;nbsp; &lt;p&gt;それをやったその日から僕の地獄に音楽は絶えない  &lt;p&gt;「子羊爆発しろ～っ！」&amp;nbsp; &lt;p&gt;--------------- &lt;p&gt;まだ続いてます。でも、年内納品は何とかなりました。 &lt;p&gt;納会の帰り、これをずっと歌いながら帰った事は後悔してませんｗ&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/165144.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>片桐の近況</title><link>http://blogs.wankuma.com/esten/archive/2008/12/27/165139.aspx</link><pubDate>Sat, 27 Dec 2008 21:44:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2008/12/27/165139.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/165139.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2008/12/27/165139.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/165139.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/165139.aspx</trackback:ping><description>&lt;p&gt;年末年始ですが、何するわけでもなくｗｗｗ&lt;/p&gt; &lt;p&gt;平凡な長期休暇を満喫しようかという私なのですが……&lt;/p&gt; &lt;p&gt;実は、ただ今、着物着付師のお免除をとるため、修行中の身です。おなじ生徒さんはみんな年下だし、和裁やファッション、美容専門学校の生徒さんが多く、一人だけフルタイム勤務の社会人で年齢全くもって違うという状態です。&lt;/p&gt; &lt;p&gt;着付師の先生に弟子入りしているわけですが、先生の今までの生徒さんでのジンクスに「システムエンジニアやIT系職種経験者は挫折して辞めてしまう」というものがあるそうで、私で歴代５人目になるとか。&lt;/p&gt; &lt;p&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;「そのジンクス、私が破りますよ、せんせ♪」と微笑んだ手前&lt;/strong&gt;&lt;/font&gt;、挫折する気はありません。残業の危険があるなら、先に手を打てば良い、発言力を持てば良い、それだけのフォローができる体制にすれば良い。ある意味、自分の仕事の仕方や考え方を整理して見直して、行動にしていく良い機会になってる気もします。&lt;/p&gt; &lt;p&gt;修行中の着物関係はしゃべり出すとうるさいのでｗ、別のブログにまとめました。といっても、一方的につぶやくだけでコメントとかは入りませんが＾＾；&lt;/p&gt; &lt;p&gt;kimonolog&lt;/p&gt; &lt;p&gt;&lt;a title="http://esten.tumblr.com/" href="http://esten.tumblr.com/"&gt;http://esten.tumblr.com/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;そんな私が、次回東京、登壇することになってます。ええ、着物で登壇します。&lt;/p&gt; &lt;p&gt;&lt;font color="#008000"&gt;&lt;strong&gt;え？ハム？冬は寒いので脱走させるわけにはいきませんやん♪&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;と言いつつ、&lt;font color="#ff0000"&gt;実は「まじめな技術話」は初めてかもしれません&lt;/font&gt;。DEMOもできればやりたいなぁなんて思いながら、鋭意、スライド作成中です。&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.wankuma.com/seminar/20090124tokyo28/Default.aspx" href="http://www.wankuma.com/seminar/20090124tokyo28/Default.aspx"&gt;http://www.wankuma.com/seminar/20090124tokyo28/Default.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;よかったら、聞いてやってください。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/165139.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>やまたのおろちが酒を飲む～片桐的VB.NETスレッドプログラミング～その３</title><link>http://blogs.wankuma.com/esten/archive/2008/12/27/165136.aspx</link><pubDate>Sat, 27 Dec 2008 21:27:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2008/12/27/165136.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/165136.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2008/12/27/165136.aspx#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/165136.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/165136.aspx</trackback:ping><description>&lt;p&gt;やまたのおろちが酒飲んでます。あいかわらずの飲兵衛です。&lt;/p&gt; &lt;p&gt;その１&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.wankuma.com/esten/archive/2008/12/03/162607.aspx"&gt;http://blogs.wankuma.com/esten/archive/2008/12/03/162607.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;ここでは、ただ首一本がガブガブ飲むだけだったんだけど、それじゃ他の首が飲ませろとうるさいので、全部の首がせーのっ！で飲めるようにして&lt;/p&gt; &lt;p&gt;その２&lt;/p&gt; &lt;p&gt;&lt;a title="http://blogs.wankuma.com/esten/archive/2008/12/09/163043.aspx" href="http://blogs.wankuma.com/esten/archive/2008/12/09/163043.aspx"&gt;http://blogs.wankuma.com/esten/archive/2008/12/09/163043.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;となったわけだけれども、コメントでツッコミがあったように、これだけでは全く持って、ダメダメプログラミングなわけですｗ。&lt;font color="#ff0000"&gt;はい、わざとです。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;では、どうしようか？　リファクタする？&lt;/p&gt; &lt;p&gt;&lt;font color="#000080"&gt;でもその前に、まだやっておかなくちゃいけないことがあるんだわ。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;やまたのおろちが飲みたい酒ツボが１つだったときにどうなるかって話。&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:bc38ab75-1fcc-40d6-9c5d-ca141bc3d4ac" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="vb:nocontrols"&gt;Imports System
Imports System.Threading

Module OrochMTA

    Delegate Sub DrinkingSAKE()

    '酒ツボは一つ
    Private sakeTubo As Integer

    '酒ツボの残り
    Private sakeNokori As Integer

    &amp;lt;MTAThread()&amp;gt; _
  Public Sub Main()

    '酒ツボに酒を準備
    sakeTubo = 50000
    sakeNokori = sakeTubo

    '本体で首が別々に酒飲みするのを身構える

        Dim ts As New ThreadStart(AddressOf OrochiDrinking)

        Dim workerThread As New Thread(ts)

        workerThread.SetApartmentState(ApartmentState.MTA)

        workerThread.Start()

        workerThread.Join()

        Stop

  End Sub

    Private Sub OrochiDrinking()

        'まずは首を八本で飲んでみる
        Dim headCount As Integer = 8

        '酔っ払い待ち行列を首の数だけ準備
        Dim yoppa(headCount - 1) As WaitHandle

        For i As Integer = 1 To headCount

            '飲んだ首から酔っ払いへと
            yoppa(i - 1) = HeadDrinking(i).AsyncWaitHandle

        Next

        '全部の首が酔っ払いになるまで待機
        WaitHandle.WaitAll(yoppa)

    End Sub

    Private Function HeadDrinking(ByVal headNo As Integer) As IAsyncResult

        '指定した番号の首に酒を飲ませる
        Dim myHead As New OrochiHead(headNo)

        Dim gubi As New DrinkingSAKE(AddressOf myHead.Drink)

        '酒飲み開始とともに、酔っ払い待ち行列へ戻す
        Return gubi.BeginInvoke(Nothing, Nothing)

    End Function

    'おろちの首をクラス化
Private Class OrochiHead

    Private meNumber As Integer

    '何番目の首なのかを保存
    Public Sub New(ByVal headNo As Integer)

        meNumber = headNo

    End Sub

    '酒を飲むメソッド
    Public Sub Drink()

        Dim sakeZuki As New Thread( _
          New ThreadStart(AddressOf DrinkSAKE)) ' 

        sakeZuki.Start()
        sakeZuki.Join()

          Console.WriteLine("ぷはーっ！ {0}番目の首、飲み終わり！", meNumber)

    End Sub


  ' 酒のみスレッド
  Private Sub DrinkSAKE()

        Dim totalDrunk As Integer = 0
        Dim nowDrink As Integer

        Dim oneDrink As New Random
        Dim oneBreath As New Random

        '酒ツボの中の酒を飲み干す
        While (sakeNokori &amp;gt; 0)

            '一回飲むたびに息継ぎ
            Thread.Sleep(oneBreath.Next(30, 60))

            '一回ぐび
            nowDrink = oneDrink.Next(1, 100)

            '全部でどれくらい飲んだ？
            sakeNokori -= nowDrink

            Console.WriteLine("{0}番目の首が {1} リットル ぐびっ : 残り {2} リットル", meNumber, nowDrink, sakeNokori)


        End While

  End Sub

End Class

End Module&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;ぱっと見、これだけに見えるよね？&lt;/p&gt;
&lt;p&gt;でも、これが落とし穴。&lt;/p&gt;
&lt;p&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="283" alt="image" src="http://esten.cside.com/img/VB.NET_124A3/image.png" width="362" border="0"&gt; &lt;/p&gt;
&lt;p&gt;CPUの数が多い時、スレッドはどのCPUで管理されるかはOS次第。でもそのバラバラに動いているスレッドの処理が一箇所のアドレスにある値を読み出して書き出すわけだから、「今ある酒の量が本当に正しい」かどうか判らなくなる。これが小さなスレッドと一瞬で終わるプログラムなら気がつかないかもしれない。でも、沢山のCPU、スレッドで動いたときこの落とし穴ははっきりと結果にでてくるんだよね。&lt;/p&gt;
&lt;p&gt;&lt;font color="#008000"&gt;つまり、一つの酒ツボから複数の首が酒を飲むわけだけど、実際に、首の動きを制御しているのは、CPU。だから、CPUが複数あると、本当の意味で「同時に」首が酒を飲むことができるわけで、そうなると、酒ツボから飲んだ→残りこんだけ、という動きも本当の意味で「同時に」起きちゃうことになるの。&lt;strong&gt;そうなっちゃうと、今の酒の残り、は本当に正しい！ということがこのままだといえなくなっちゃうんだ。&lt;/strong&gt;&lt;font color="#ff0000"&gt;たとえば残り１００リットルから、ある首Aが２０リットル飲んで、ある首Bが１０リットル飲んだ。この時、本当だったら残りは７０リットルのはずなんだけど、２個のCPUがあるときに、Aの「100-20」の計算を１CPU、Bの「100-10」の計算を１CPUがそれぞれに同時にしちゃったら結果は「80」もしくは「90」として格納、これ、プログラム的には正しい動作なんだもの。&lt;/font&gt;見えないだけで、実はやまたのおろちの首はおもいっきり絡まってて、絡まったなりに酒を飲んだツモリになってたりしてるってことだよね。&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;厄介なのは、これ、必ず再現できると限らないんだ。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;VisualStudioのデバッガをつかってブレークポイントを仕掛けて止めただけでも、マルチスレッドプログラミングは直列の処理に最適化されてしまうので、ステップするとうまくいっちゃったりとかする。「なんで？何が悪いの？」がさっぱり判らなくなっちゃう。&lt;/p&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;&lt;strong&gt;おそろしいよね、それって。&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;だから、スレッド間でやり取りする値、読み出したり書き出したり更新したりする時には、必ずスレッド間で同期を取れるように作ってあげないといけない。&lt;/p&gt;
&lt;p&gt;マルチスレッドが難しいのはこの考え方があるからで、実はこれを回避するための処理クラスやステートメントが、ちゃんと用意されてたりするのね。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;それが、InerLockedクラス、そして、SyncLockステートメントブロック&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;じゃ、こいつらを使って、やまたのおろちに行儀良くお酒を飲んでもらおうと思う。ついでに、リファクタってやつもやってみるってことで、それは次回ねｗ&lt;/p&gt;
&lt;p&gt;&lt;font color="#ff00ff"&gt;実はまだ出てない新キャラがいるんだ、スサノオってのがｗｗｗ&lt;/font&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/165136.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>片桐　継（Tugu Katagiri）</dc:creator><title>やまたのおろちが酒を飲む～片桐的VB.NETスレッドプログラミング～その２</title><link>http://blogs.wankuma.com/esten/archive/2008/12/09/163043.aspx</link><pubDate>Tue, 09 Dec 2008 10:23:00 GMT</pubDate><guid>http://blogs.wankuma.com/esten/archive/2008/12/09/163043.aspx</guid><wfw:comment>http://blogs.wankuma.com/esten/comments/163043.aspx</wfw:comment><comments>http://blogs.wankuma.com/esten/archive/2008/12/09/163043.aspx#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://blogs.wankuma.com/esten/comments/commentRss/163043.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/esten/services/trackbacks/163043.aspx</trackback:ping><description>&lt;p&gt;&lt;strong&gt;やまたのおろちはお酒大好き&lt;/strong&gt;。&lt;font color="#000080"&gt;とりあえず前回は代表の首一本だけが酒ツボからグビグビいっちゃう想定でシングルスレッドのお話&lt;/font&gt;をしてたりなんかしたのね。&lt;/p&gt; &lt;p&gt;&lt;a title="http://blogs.wankuma.com/esten/archive/2008/12/03/162607.aspx" href="http://blogs.wankuma.com/esten/archive/2008/12/03/162607.aspx"&gt;http://blogs.wankuma.com/esten/archive/2008/12/03/162607.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;でも、これだと他の酒のみ待ち首はきっとウルサイ。先に飲ませろ、俺に飲ませろ、&lt;strong&gt;まぁ黙れやこの飲兵衛よっぱらい爬虫類もどきドモがっ！&lt;/strong&gt;といいたくなるような状況にきっとなっちゃう。&lt;/p&gt; &lt;p&gt;&lt;font color="#008000"&gt;&lt;strong&gt;そこで、全部の首に、いっせーーーーの！で飲ませようというのが今回のお話、マルチスレッドね。&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;実は前回で、一つの首が酒を飲むのにデリゲートしてシングルスレッドで飲ませるところまではできた。つまり簡単に考えれば、&lt;font color="#ff0000"&gt;シングルになっているところをマルチにするだけで、事は解決できるはず&lt;/font&gt;。&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:812469c5-0cb0-4c63-8c15-c81123a09de7:616a266c-5095-4425-8872-da35038df9f7" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre name="code" class="vb:nocontrols"&gt;Imports System.Threading

Module OrochMTA

    Delegate Sub DrinkingSAKE()

    &amp;lt;MTAThread()&amp;gt; _
  Public Sub Main()

    '本体で首が別々に酒飲みするのを身構える

        Dim ts As New ThreadStart(AddressOf OrochiDrinking)

        Dim workerThread As New Thread(ts)

        workerThread.SetApartmentState(ApartmentState.MTA)

        workerThread.Start()

        workerThread.Join()

        Stop

  End Sub

    Private Sub OrochiDrinking()

        'まずは首を八本で飲んでみる
        Dim headCount As Integer = 8

        '酔っ払い待ち行列を首の数だけ準備
        Dim yoppa(headCount - 1) As WaitHandle

        For i As Integer = 1 To headCount

            '飲んだ首から酔っ払いへと
            yoppa(i - 1) = HeadDrinking(i).AsyncWaitHandle

        Next

        '全部の首が酔っ払いになるまで待機
        WaitHandle.WaitAll(yoppa)

    End Sub

    Private Function HeadDrinking(ByVal headNo As Integer) As IAsyncResult

        '指定した番号の首に酒を飲ませる
        Dim myHead As New OrochiHead(headNo)

        Dim gubi As New DrinkingSAKE(AddressOf myHead.Drink)

        '酒飲み開始とともに、酔っ払い待ち行列へ戻す
        Return gubi.BeginInvoke(Nothing, Nothing)

    End Function

    'おろちの首をクラス化
Private Class OrochiHead

    Private meNumber As Integer

    '何番目の首なのかを保存
    Public Sub New(ByVal headNo As Integer)

        meNumber = headNo

    End Sub

    '酒を飲むメソッド
    Public Sub Drink()

        Dim sakeZuki As New Thread( _
          New ThreadStart(AddressOf DrinkSAKE)) ' 

        sakeZuki.Start()
        sakeZuki.Join()

          Console.WriteLine("ぷはーっ！ {0}番目の首、飲み終わり！", meNumber)

    End Sub


  ' 酒のみスレッド
  Private Sub DrinkSAKE()

        '酒ツボの中の酒の量
        Dim totalSAKE As Integer = 1000

        Dim totalDrunk As Integer = 0
        Dim nowDrink As Integer

        Dim oneDrink As New Random
        Dim oneBreath As New Random

        '酒ツボの中の酒を飲み干す
        While (totalDrunk &amp;lt;= totalSAKE)

            '一回飲むたびに息継ぎ
            Thread.Sleep(oneBreath.Next(30, 60))

            '一回ぐび
            nowDrink = oneDrink.Next(1, 100)
            Console.WriteLine("{0}番目の首が {1} リットル ぐびっ", meNumber, nowDrink)

            '全部でどれくらい飲んだ？
            totalDrunk += nowDrink

        End While

  End Sub

End Class

End Module

&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;変わった部分、あんまり無い（笑）。でも動かしてみると判るけど、全部の首が並列でぐびぐび酒飲んじゃう。&lt;/p&gt;
&lt;p&gt;ポイントは、&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;７行目：&amp;lt;MTAThread()&amp;gt;&lt;br&gt;16行目：workerThread.SetApartmentState(ApartmentState.MTA)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;これによって、「これから動かすスレッドは並列で動かすつもりなんでよろしく！」と準備して、&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;54行目：Return gubi.BeginInvoke(Nothing, Nothing)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;で実際に、スレッドが「非同期で」起動、でもって、一つ一つのスレッドの背番号（IAsyncResultクラスのWaitHandle）をうけとって&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;42行目：WaitHandle.WaitAll(yoppa)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;で全部の背番号にぶら下がったスレッドが終了するまで処理を待機する、ってところ。&lt;/p&gt;
&lt;p&gt;なんだ、簡単じゃぁん！なんて思うでしょ？実際、簡単に見えてくるもの。でもこれがでっかいでっかい落とし穴。動くけど、このソースだけじゃまだまだダメだったりなんかする。過信するなよ、.NetFrameworkプログラミング（笑）&lt;/p&gt;
&lt;p&gt;&lt;font color="#008000"&gt;&lt;strong&gt;実は村で用意したのは馬鹿でかい酒ツボ一個。だから、首一つにつき酒ツボ一つじゃなくて、全部の首で一つの酒ツボから酒を飲むことになっちゃった！&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;って、この酒ツボが一個になった時に起きる時、マルチスレッドプログラミングで落っこちる地獄への入り口で、これがまた、ふっかーーい話だったりするの。&lt;font color="#ff0000"&gt;&lt;strong&gt;覚悟せよ、次回（笑）&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/esten/aggbug/163043.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>