...ing logging 4.0

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

しごと


転勤

4月末に転勤になりました.

今までは地下鉄車両の整備をやってましたが,新しい職場では事務をしてます.
整備員のときに「あれが欲しいこれが欲しい」と要求することがあったのですが,今度はその要求を聞く側です.
まあそれはともかく.
以下,愚痴.

続きを読む

GW

最近,日記らしいことを全然書いていませんでした.


ヘッドフォンのコードに足を引っかけて落として壊してしまったので,
ついにホットボンドを買ってきました.
強度を持たせようと思って盛りすぎたので少しいびつな形になったけど,使用感はまずまず.
これならまだしばらくは使えます.
前からホットボンドが欲しかったんだけど,いざ買うとなると今は特に困ってないからなあ,と思って買いませんでした.
これで色々壊れても直せますね.


母の日だったので,カーネーションをプレゼントしました.喜んでもらえたのかな?
父が仕事で使う長靴が欲しいと言うのでそれも購入.長靴くらいすぐ買えるがな!


最近,家の中で不便なところを探して直していってます.
安価で簡単に改善できるところがたくさんあるので,
ほったらかしにせず注意して見直してます.


さあー明日からまた頑張って恐ろしい職場に行かなきゃ!!><;

スレッドセーフな銀行クラス(2)

すべてのメソッドの内容を synchronized ブロックに含めるのならクラスを synchronized クラスにしてもよい.
synchronized クラスのメンバはそのインスタンスを shared 型で生成しなければ呼び出せないので,この場合には new Bank ではなく new shared(Bank) とする.

import std.stdio;
import core.thread;

synchronized class Bank
{
	private int money_;
	
	void payin(int m)
	{
		money_ += m;
	}
	void payout(int m)
	{
		// お金があるときだけ出金する
		if (money_ - m > 0)
		{
			money_ -= m;
		}
		if (money_ < 0)
		{
			// ここには来ない
			throw new Exception("pay out exception.");
		}
	}
	int money() @property
	{
		return money_;
	}
}

void main()
{
	auto bank = new shared(Bank);
	auto tg = new ThreadGroup;
	bool isRunning = true;
	
	// 100ずつ出金する人
	tg.create = {
		while (isRunning)
		{
			try
			{
				bank.payout(100);
			}
			catch (Exception e)
			{
				isRunning = false; // 両方のスレッドを終了する
				throw e;
			}
		}
	};
	
	// 100ずつ入金する人
	tg.create = {
		while (isRunning)
		{
			bank.payin(100);
		}
	};
	
	// スレッドを回す
	tg.joinAll();
}