Javaのようにすべてのクラスの基底とするかは未決定であるが、同期プリミティブや等価性の判定の仕組みなど、オブジェクトが持っていると都合のよい機能が提供されることになる。
機能一覧
つぎに示すのはインターフェースである。インターフェースの構造についてはインスタンス関数のテーブルを参照。
typedef struct interface_lwd_lang_Object {
lwd_lang_Class class_instance;
void* (*interface_of)(char* name);
void (*finalize)(lwd_lang_Object this);
lwd_lang_Class (*getClass)(lwd_lang_Object this);
int (*hashCode)(lwd_lang_Object this);
boolean (*equals)(lwd_lang_Object this, lwd_lang_Object object);
void (*lock)(lwd_lang_Object this);
void (*unlock)(lwd_lang_Object this);
void (*wait)(lwd_lang_Object this, long long timeout);
void (*notify)(lwd_lang_Object this);
void (*notifyAll)(lwd_lang_Object this);
lwd_lang_String (*toString)(lwd_lang_Object this);
}* interface_lwd_lang_Object;
幾つか Javaのそれを真似ている。
finalizeはインスタンスを破棄するときに呼ばれる。
Javaではただ呼ばれるだけで、実際のインスタンスのメモリは別途コレクタにより回収される。
softiesでは、finalizeの中で自オブジェクトおよび自オブジェクトとライフサイクルをともにするオブジェクトのメモリを解放しなけれならない。
hashCodeと equalsは同価性の判断に使用される。
ただし、Objectクラスでは equalsは同一性の評価を行う。
同一性は2つのインスタンスのアドレスが等しいかどうかを表す。
同価性は、2つのインスタンスのアドレスにかかわらず、値が等しいかどうかを表す。
Objectのサブクラスは hashCodeと equalsをオーバライドすることができる。
どちらか一方をオーバライドした場合はもう一方もオーバライドする必要がある事と、equalsが成立する場合の hashCodeは等しくなければならない事は Javaと同じ。
lock, unlock, wait, notify, notifyAllは同期プリミティブである。これらを実現するために、pthreadの mutexと条件変数が使用している。
Cでは synchronizedな関数やブロックを記述することができないため、lockと unlockで代用する。分岐や大域脱出などにより unlock漏れが無いようにするのはプログラマの責任である。
wait, notify, notifyAllはいづれも lockと unlockでくくられていなければならない。
notify、notifyAllにより同一のモニタで waitしているスレッドの実行を再開させる。両者の違いは同一のモニタで waitしているスレッドが複数あるときに、notifyは waitしているもスレッドうちの1つだけを再開させるのに対し、notifyAllは全てを再開させることである。
notifyでどのスレッドが再開するかは特定することはできない。waitした順とは限らないし、いつも同じスレッドに偏るかも知れない。
notifyはスレッドプールのように要求を処理するスレッドを割り当てるために使用される。
notifyAllは複数のスレッドでタイミングを同期させるために使用される。
実質的増税が続くなか、関税は下がる傾向にある。 関税も上げよ。
0 件のコメント:
コメントを投稿