আপনি যন্ত্রাদি অনুলিপি-নির্মাণ এবং সরানো নির্মাণ অনুপস্থিত। আপনার প্রোগ্রামে একটি সাধারণ পরিবর্তন তার প্রমাণ প্রদান করবে যেখানে সেখানে নির্মাণ চলছে।
অনুলিপি নির্মাণকারী
#include <iostream>
#include <thread>
#include <functional>
using namespace std;
class tFunc{
int x;
public:
tFunc(){
cout<<"Constructed : "<<this<<endl;
x = 1;
}
tFunc(tFunc const& obj) : x(obj.x)
{
cout<<"Copy constructed : "<<this<< " (source=" << &obj << ')' << endl;
}
~tFunc(){
cout<<"Destroyed : "<<this<<endl;
}
void operator()(){
x += 10;
cout<<"Thread running at : "<<x<<endl;
}
int getX() const { return x; }
};
int main()
{
tFunc t;
thread t1{t};
if(t1.joinable())
{
cout<<"Thread is joining..."<<endl;
t1.join();
}
cout<<"x : "<<t.getX()<<endl;
return 0;
}
আউটপুট (ঠিকানাগুলি পৃথক)
Constructed : 0x104055020
Copy constructed : 0x104055160 (source=0x104055020)
Copy constructed : 0x602000008a38 (source=0x104055160)
Destroyed : 0x104055160
Thread running at : 11
Destroyed : 0x602000008a38
Thread is joining...
x : 1
Destroyed : 0x104055020
কন্সট্রাক্টর এবং মুভ কনস্ট্রাক্টর কপি করুন
আপনি যদি একটি সরানো কর্টর সরবরাহ করেন তবে অন্য কোনও-অনুলিপিগুলির মধ্যে এটির জন্য কমপক্ষে একটির পক্ষে পছন্দ করা হবে:
#include <iostream>
#include <thread>
#include <functional>
using namespace std;
class tFunc{
int x;
public:
tFunc(){
cout<<"Constructed : "<<this<<endl;
x = 1;
}
tFunc(tFunc const& obj) : x(obj.x)
{
cout<<"Copy constructed : "<<this<< " (source=" << &obj << ')' << endl;
}
tFunc(tFunc&& obj) : x(obj.x)
{
cout<<"Move constructed : "<<this<< " (source=" << &obj << ')' << endl;
obj.x = 0;
}
~tFunc(){
cout<<"Destroyed : "<<this<<endl;
}
void operator()(){
x += 10;
cout<<"Thread running at : "<<x<<endl;
}
int getX() const { return x; }
};
int main()
{
tFunc t;
thread t1{t};
if(t1.joinable())
{
cout<<"Thread is joining..."<<endl;
t1.join();
}
cout<<"x : "<<t.getX()<<endl;
return 0;
}
আউটপুট (ঠিকানাগুলি পৃথক)
Constructed : 0x104057020
Copy constructed : 0x104057160 (source=0x104057020)
Move constructed : 0x602000008a38 (source=0x104057160)
Destroyed : 0x104057160
Thread running at : 11
Destroyed : 0x602000008a38
Thread is joining...
x : 1
Destroyed : 0x104057020
রেফারেন্স মোড়ানো
আপনি যদি এই অনুলিপিগুলি এড়াতে চান তবে আপনি আপনার কলযোগ্যকে একটি রেফারেন্স র্যাপার ( std::ref) এ মোড়াতে পারেন । যেহেতু tথ্রেডিং অংশটি শেষ হওয়ার পরে আপনি ব্যবহার করতে চান , এটি আপনার পরিস্থিতির পক্ষে কার্যকর। অভ্যাসের ক্ষেত্রে কল অবজেক্টের রেফারেন্সের বিরুদ্ধে থ্রেডিংয়ের সময় আপনাকে অবশ্যই খুব সতর্কতা অবলম্বন করতে হবে , কারণ বস্তুর আজীবন কমপক্ষে যতক্ষণ থ্রেডটি রেফারেন্সটি ব্যবহার করে ততক্ষণ প্রসারিত করতে হবে।
#include <iostream>
#include <thread>
#include <functional>
using namespace std;
class tFunc{
int x;
public:
tFunc(){
cout<<"Constructed : "<<this<<endl;
x = 1;
}
tFunc(tFunc const& obj) : x(obj.x)
{
cout<<"Copy constructed : "<<this<< " (source=" << &obj << ')' << endl;
}
tFunc(tFunc&& obj) : x(obj.x)
{
cout<<"Move constructed : "<<this<< " (source=" << &obj << ')' << endl;
obj.x = 0;
}
~tFunc(){
cout<<"Destroyed : "<<this<<endl;
}
void operator()(){
x += 10;
cout<<"Thread running at : "<<x<<endl;
}
int getX() const { return x; }
};
int main()
{
tFunc t;
thread t1{std::ref(t)}; // LOOK HERE
if(t1.joinable())
{
cout<<"Thread is joining..."<<endl;
t1.join();
}
cout<<"x : "<<t.getX()<<endl;
return 0;
}
আউটপুট (ঠিকানাগুলি পৃথক)
Constructed : 0x104057020
Thread is joining...
Thread running at : 11
x : 11
Destroyed : 0x104057020
নোট করুন যদিও আমি কপি-সিটার এবং মুভ-সিটারের ওভারলোডগুলি রেখেছি, উভয়কেই ডাকা হয়নি, কারণ রেফারেন্সের মোড়ক এখন জিনিসটি অনুলিপি / সরানো হয়েছে; এটি উল্লেখ জিনিস নয়। এছাড়াও, এই চূড়ান্ত পদ্ধতির মাধ্যমে আপনি সম্ভবত যা খুঁজছিলেন তা সরবরাহ করে; t.xপিছনে mainআসলে, পরিবর্তিত হয় 11। এটি পূর্বের প্রচেষ্টা ছিল না। তবে এটি যথেষ্ট চাপ দিতে পারে না: এটি করতে সাবধান হন । অবজেক্টের জীবনকাল সমালোচনামূলক ।
সরান, এবং কিছুই না
অবশেষে, tআপনার উদাহরণ হিসাবে যেমন ধরে রাখার আপনার আগ্রহ নেই , আপনি সরল শব্দার্থক ব্যবহার করে সোজা সূত্রে প্রেরণ করতে পারেন, সেই পথ ধরেই।
#include <iostream>
#include <thread>
#include <functional>
using namespace std;
class tFunc{
int x;
public:
tFunc(){
cout<<"Constructed : "<<this<<endl;
x = 1;
}
tFunc(tFunc const& obj) : x(obj.x)
{
cout<<"Copy constructed : "<<this<< " (source=" << &obj << ')' << endl;
}
tFunc(tFunc&& obj) : x(obj.x)
{
cout<<"Move constructed : "<<this<< " (source=" << &obj << ')' << endl;
obj.x = 0;
}
~tFunc(){
cout<<"Destroyed : "<<this<<endl;
}
void operator()(){
x += 10;
cout<<"Thread running at : "<<x<<endl;
}
int getX() const { return x; }
};
int main()
{
thread t1{tFunc()}; // LOOK HERE
if(t1.joinable())
{
cout<<"Thread is joining..."<<endl;
t1.join();
}
return 0;
}
আউটপুট (ঠিকানাগুলি পৃথক)
Constructed : 0x104055040
Move constructed : 0x104055160 (source=0x104055040)
Move constructed : 0x602000008a38 (source=0x104055160)
Destroyed : 0x104055160
Destroyed : 0x104055040
Thread is joining...
Thread running at : 11
Destroyed : 0x602000008a38
এখানে আপনি অবজেক্টটি তৈরি হয়েছে তা দেখতে পেয়েছেন, একই-এর যথাযথ রেফারেন্সটি সোজা পাঠানো হয়েছে std::thread::thread(), যেখানে এটি আবার তার চূড়ান্ত বিশ্রামস্থানে স্থানান্তরিত হবে, সেই বিন্দু থেকে থ্রেডের মালিকানাধীন। কোনও অনুলিপি-জড়িতরা জড়িত নয়। আসল ডিটারগুলি দুটি শেল এবং চূড়ান্ত গন্তব্য কংক্রিট অবজেক্টের বিরুদ্ধে।