আমি আমার ক্লাসে কিছু থ্রেড রেজিস্ট্রেশন করতে চাই, তাই আমি 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
। যদি একটি স্ট্যাটিক thread_local
Foo foo
তৈরি করা হয়, এর অর্থ একটি থ্রেড তৈরি হয়েছে।
তবে আমি কোডটি চালানোর সময়, Foo()
প্রিন্টগুলির মধ্যে কিছুই নেই এবং যদি আমি Bar
এর কনস্ট্রাক্টরের মন্তব্যটি সরিয়ে ফেলি , যা ব্যবহার করে foo
, কোডটি ঠিক কাজ করে।
আমি এটি জিসিসি (.4.৪.০) এবং কলং (on.০.০) এ চেষ্টা করেছি এবং ফলাফলগুলি একই are আমি অনুমান করি যে সংকলকটি আবিষ্কার করেছে foo
যা অব্যবহৃত এবং কোনও উদাহরণ উত্পন্ন করে না। সুতরাং
- সংকলক
static thread_local
সদস্যকে উপেক্ষা করেছে ? আমি কীভাবে এটির জন্য ডিবাগ করতে পারি? - যদি তা হয় তবে একজন সাধারণ
static
সদস্যের কেন এই সমস্যা নেই?