#include <thread>
#include <iostream>
class bar {
public:
void foo() {
std::cout << "hello from member function" << std::endl;
}
};
int main()
{
std::thread t(&bar::foo, bar());
t.join();
}
সম্পাদনা: আপনার সম্পাদনা অ্যাকাউন্টিং, আপনি এটি এইভাবে করতে হবে:
std::thread spawn() {
return std::thread(&blub::test, this);
}
আপডেট: আমি আরও কিছু বিষয় ব্যাখ্যা করতে চাই, তাদের কয়েকটি সম্পর্কে মন্তব্য করা হয়েছে।
উপরে বর্ণিত সিনট্যাক্সটি ইনভোক সংজ্ঞা (.820.8.2.1) এর শর্তে সংজ্ঞায়িত করা হয়েছে:
ইনভোক (এফ, টি 1, টি 2, ..., টিএন) সংজ্ঞায়িত করুন:
- (t1। * f) (t2, ..., tN) যখন f টি শ্রেণি T এর সদস্য ফাংশনের পয়েন্টার হয় এবং টি 1 টি টাইপ টিয়ের একটি অবজেক্ট বা টাইপ টির কোনও অবজেক্টের রেফারেন্স বা একটি রেফারেন্স হয় টি থেকে প্রাপ্ত কোনও ধরণের অবজেক্ট;
- ((* t1)। * f) (t2, ..., tN) যখন f টি শ্রেণীর টি এর সদস্য ফাংশনের পয়েন্টার হয় এবং টি 1 পূর্ববর্তী আইটেমটিতে বর্ণিত কোনও ধরণের নয়;
- t1। * f যখন N == 1 এবং f টি শ্রেণি T এর সদস্য ডেটার পয়েন্টার হয় এবং t 1 টি টাইপ T এর
একটি অবজেক্ট বা টাইপ T এর কোনও অবজেক্টের রেফারেন্স বা কোনও অবজেক্টের রেফারেন্স হয়
টাইপ থেকে প্রাপ্ত টাইপের টি;
- (* t1)। * f যখন N == 1 এবং f টি শ্রেণি T এর সদস্য ডেটার পয়েন্টার হয় এবং টি 1 পূর্ববর্তী আইটেমটিতে বর্ণিত কোনও ধরণের নয়;
- অন্যান্য সমস্ত ক্ষেত্রে চ (টি 1, টি 2, ..., টিএন)।
আরেকটি সাধারণ সত্য যা আমি উল্লেখ করতে চাই তা হ'ল ডিফল্টরূপে থ্রেড কনস্ট্রাক্টর এতে প্রেরিত সমস্ত যুক্তি অনুলিপি করবে। এর কারণ হ'ল যুক্তিগুলির কলিং থ্রেডকে বহির্মুখী করা দরকার হতে পারে, আর্গুমেন্টগুলি অনুলিপি করে তার নিশ্চয়তা দেয়। পরিবর্তে, আপনি যদি সত্যিই একটি রেফারেন্স পাস করতে চান তবে আপনি এটি std::reference_wrapper
দ্বারা তৈরি একটি ব্যবহার করতে পারেন std::ref
।
std::thread (foo, std::ref(arg1));
এটি করার মাধ্যমে, আপনি প্রতিশ্রুতি দিচ্ছেন যে থ্রেডটি যখন থ্রেডে চালিত হবে তখন আপনি তর্কগুলি এখনও বিদ্যমান থাকবে কিনা তা গ্যারান্টি দেওয়ার বিষয়ে যত্ন নেবেন।
দ্রষ্টব্য যে উপরে উল্লিখিত সমস্ত জিনিসগুলিতে std::async
এবং প্রয়োগ করা যেতে পারে std::bind
।