| 著作一覧 |
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");
// ワーカスレッドの始末をどうつけるかは別の問題
}
}
後でやばいと思ったけど、この利用方法ならやばくないか。ちょっと安心。
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();
}
}
volatileとかlock(synchronized)とかつらつらと眺めるに、C++でWin32のネイティブスレッドを扱ってたときのほうが楽だったな。VMは難しい。
new Timer(delegate (object o)
{
((Timer)o).Dispose();
// 何か仕事する。
}).Change(TIMEOUT_VALUE, Timeout.Infinite);
while (!received)
{
;
}
volatile付けないと
ld ax, _received jnz 1$ 0$ jmp 0$ 1$とかなったはず。
まるで最初のWizardryの味のあるイラスト付きマニュアルが、ベインに変わったかのような(というか、3D風味なのでUOというか)、感じを受ける。
Compilers: Principles, Techniques, and Tools(Aho, Alfred V.)
というか、31位とは売れてるなぁ。
ジェズイットを見習え |
お、もう入手できました? 私のamazonの注文は2006/9/23 - 2006/10/7に発送予定になってますがまだ未発送です……
え、今確認したら私の注文では11月ですよ orz<br>ひょっとして注文しなおしたほうが早く来たりして…
あ、今です。AmazonからDMが来たから注文ついでに貼っただけです。(インドは今日届きました)
(今です……ってわけわからねぇ。注文したのが今、というか貼ったときです)
なんでまとめて書かねぇんだ? >おれ<br>発送予定日は、2006/10/10 - 2006/10/18 です。
Amazonに「ごるぁ」メッセージ入れたら、出荷予定時期が変わりました(笑)。下手に早めに予約していると後回しになったりするんですよね。konozamaと呼ばれる所以。
ああ、そういう意味だったのかぁ。(字面の意味、今気付いた)