スレッドローカルストレージ(TLS)のサンプルです。
nn::nlib::threading::Tls<T>
クラステンプレートを使うことにより、同じTls<T>
のオブジェクトからスレッド毎に違うクラスTのインスタンスを参照することができます。
スレッドが終了する際、クラスTのデストラクタが自動で呼ばれるのでリソースの解放等を行うことができます。
サンプルでは、MyThreadLocalClass
のコンストラクタが現在時刻をデータメンバに記録し、デストラクタにおける現在時刻との差分を計算し、コンソールに表示します。
using nlib_ns::threading::Tls;
using nlib_ns::threading::Thread;
class MyThreadLocalClass {
public:
MyThreadLocalClass() {
DateTime::GetNow(&datetime_);
}
~MyThreadLocalClass() {
TimeSpan span;
DateTime dt;
DateTime::GetNow(&dt);
span = dt - datetime_;
static_cast<int>(span.ToMilliSeconds()));
}
}
private:
DateTime datetime_;
};
Tls<MyThreadLocalClass> g_threadlocal;
void ThreadFunc(int msec) {
g_threadlocal.Reset(new(std::nothrow) MyThreadLocalClass());
g_threadlocal->DoJob(TimeSpan(0, 0, msec, 0));
}
bool TlsDemo() {
Thread th1, th2, th3;
nlib_printf(
"MyThreadLocalClass's destructor shows messages.\n");
nlib_printf(
"Each thread owns MyThreadLocalClass via a Tls<MyThreadLocalClass> object\n\n");
if (e == ENOTSUP) {
nlib_printf(
"It seems that nlib_tls_alloc does not support destructor function.\n");
} else {
}
return false;
}
th1.Start(ThreadFunc, 50);
th2.Start(ThreadFunc, 100);
th3.Start(ThreadFunc, 150);
th3.Join();
th2.Join();
th1.Join();
return true;
}
static bool SampleMain(int, char**) { return TlsDemo(); }
NLIB_MAINFUNC