トップ «前の日記(2006-09-29) 最新 次の日記(2006-10-01)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2006-09-30

_ タイマー

volatile done;
...
done = false;
lock(this)
{
    // ワーカスレッドで時間がかかる処理をInvoke
    using (new Timer(delegate(object o)
                     {
                         lock(o)
                         {
                             Monitor.Pulse(o);
                         }
                     }, this, 3000, Timeout.Infinite))
    {
        Monitor.Wait(this);
    }
    if (!done)
    {
        Console.WriteLine("timeout");
        // ワーカスレッドの始末をどうつけるかは別の問題
    }
}
後でやばいと思ったけど、この利用方法ならやばくないか。ちょっと安心。

_ ref

Javaと違って、最初からref変数があるから、クロージャは実装しやすかったのかな?
using System;
using System.Threading;
public class Ts
{
    volatile bool done;
    public void foo()
    {
        int i = 0;
        lock(this)
        {
            using (new Timer(delegate(object o)
                             {
                                 lock(o)
                                 {
                                     if (i < 5)
                                     {
                                         i++;
                                     }
                                     else
                                     {
                                         done = true;
                                     }
                                     Monitor.Pulse(o);
                                 }
                             }, this, 3000, 1000))
            {
                do
                {
                    Console.WriteLine(i + "...");
                    Monitor.Wait(this);
                }
                while (!done);
            }
        }
    }
    public static void Main()
    {
        Ts t = new Ts();
        t.foo();
    }
}

_ やばいタイマー

これはだめ。
using System;
using System.Threading;
public class Ts
{
    public void foo()
    {
        lock(this)
        {
            using (new Timer(delegate(object o)
                             {
                                 lock(o)
                                 {
                                     Monitor.Pulse(o);
                                 }
                             }, this, 3000, Timeout.Infinite))
            {
                Console.WriteLine("Now I've prepared some async procs");
            }
            Monitor.Wait(this);
            Console.WriteLine("Can I reach here ?");
        }
    }
    public static void Main()
    {
        Ts t = new Ts();
        t.foo();
    }
}

_ JavaやC#でマルチスレッド

volatileとかlock(synchronized)とかつらつらと眺めるに、C++でWin32のネイティブスレッドを扱ってたときのほうが楽だったな。VMは難しい。

_ 使い捨てのタイマー

new Timer(delegate (object o)
    {
        ((Timer)o).Dispose();
        // 何か仕事する。
    }).Change(TIMEOUT_VALUE, Timeout.Infinite);

_ 一番最初のvolatile経験

80年代の末期だと思うなぁ。DOSの通信プログラム。
while (!received)
{
    ;
}
volatile付けないと
  ld   ax, _received
  jnz  1$
0$
  jmp  0$
1$
とかなったはず。

_ ドラゴンが……

まるで最初のWizardryの味のあるイラスト付きマニュアルが、ベインに変わったかのような(というか、3D風味なのでUOというか)、感じを受ける。

Compilers: Principles, Techniques, and Tools (2nd Edition)(Alfred V. Aho/Monica S. Lam/Ravi Sethi/Jeffrey D. Ullman)

というか、31位とは売れてるなぁ。

本日のツッコミ(全7件) [ツッコミを入れる]
_ takahashim (2006-09-30 12:05)

お、もう入手できました? 私のamazonの注文は2006/9/23 - 2006/10/7に発送予定になってますがまだ未発送です……

_ きむら (2006-09-30 14:13)

え、今確認したら私の注文では11月ですよ orz<br>ひょっとして注文しなおしたほうが早く来たりして…

_ arton (2006-09-30 14:43)

あ、今です。AmazonからDMが来たから注文ついでに貼っただけです。(インドは今日届きました)

_ arton (2006-09-30 14:44)

(今です……ってわけわからねぇ。注文したのが今、というか貼ったときです)

_ arton (2006-09-30 14:54)

なんでまとめて書かねぇんだ? >おれ<br>発送予定日は、2006/10/10 - 2006/10/18 です。

_ きむら (2006-09-30 19:27)

Amazonに「ごるぁ」メッセージ入れたら、出荷予定時期が変わりました(笑)。下手に早めに予約していると後回しになったりするんですよね。konozamaと呼ばれる所以。

_ arton (2006-09-30 20:45)

ああ、そういう意味だったのかぁ。(字面の意味、今気付いた)


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|

ジェズイットを見習え