...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

synchronized その1.5

import std.stdio;
import core.thread;

class SharedData
{
	public int v;
	public void increase()
	{
		// synchronizedだけだとグローバルなmutexが作成されるので,
		// 同期する必要がない他のsynchronizedブロックともお互いに処理待ちが発生してしまう
		synchronized(this) // このインスタンスのためだけのsynchronizedブロックにするのが望ましい
		{
			int a = v;
			for(int i; i<1000000; i++){} // wait
			v = a + 1;
		}
	}
}

class IncrementThread : Thread
{
	private SharedData sd;
	public this(SharedData sd)
	{
		this.sd = sd;
		super(&f);
	}
	private void f()
	{
		sd.increase();
	}
}

void main()
{
	// 全部のスレッドで共有するデータ
	auto sd = new SharedData;
	// 10個のスレッドを次々に作って実行開始
	Thread[] threads;
	for(int i; i<10; ++i)
	{
		auto t = new IncrementThread(sd);
		threads ~= t;
		t.start();
	}
	// すべてのスレッドが終了するのを待つ
	foreach(t; threads)
	{
		t.join();
	}
	// インクリメント結果を表示
	writeln(sd.v);
}