クラスでスレッド登録をしたいので、thread_local
機能のチェックを追加することにします。
#include <iostream>
#include <thread>
class Foo {
public:
Foo() {
std::cout << "Foo()" << std::endl;
}
~Foo() {
std::cout << "~Foo()" << std::endl;
}
};
class Bar {
public:
Bar() {
std::cout << "Bar()" << std::endl;
//foo;
}
~Bar() {
std::cout << "~Bar()" << std::endl;
}
private:
static thread_local Foo foo;
};
thread_local Foo Bar::foo;
void worker() {
{
std::cout << "enter block" << std::endl;
Bar bar1;
Bar bar2;
std::cout << "exit block" << std::endl;
}
}
int main() {
std::thread t1(worker);
std::thread t2(worker);
t1.join();
t2.join();
std::cout << "thread died" << std::endl;
}
コードは簡単です。私のBar
クラスには静的thread_local
メンバーがありますfoo
。static thread_local
Foo foo
が作成された場合は、スレッドが作成されたことを意味します。
しかし、コードを実行しても何もFoo()
出力されずBar
、を使用するのコンストラクターでコメントを削除するfoo
と、コードは正常に機能します。
GCC(7.4.0)とClang(6.0.0)で試してみましたが、結果は同じです。コンパイラfoo
が未使用でインスタンスを生成しないことを発見したと思います。そう
- コンパイラーは
static thread_local
メンバーを無視しましたか?これをデバッグするにはどうすればよいですか? - もしそうなら、なぜ通常の
static
メンバーがこの問題を抱えていないのですか?