আমি আমার ক্লাসে কিছু থ্রেড রেজিস্ট্রেশন করতে চাই, তাই আমি 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সদস্যের কেন এই সমস্যা নেই?