クラスでスレッド登録をしたいので、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メンバーがこの問題を抱えていないのですか?