সি ++ 11 তম :: থ্রেড বনাম পিক্সিক থ্রেড


157

আমি কেন অনুশীলনে একে অপরকে পছন্দ করব? std::threadএকটি শ্রেণি ছাড়া প্রযুক্তিগত পার্থক্য কী ?


5
অনুশীলনে আপনার ব্যবহার করা উচিতstd::async
স্টিফান ডলবার্গ

একই সমস্যা থেকে এই ভুগছেন @bamboon যেমন std::threadকরে
Gunther Piez

2
সংকলক-সমর্থন ভিউ থেকে @ হিরছহর্নসালজ, হ্যাঁ। প্রযুক্তিগত দৃষ্টিকোণ থেকে এটি ব্যতিক্রমী সুরক্ষা সরবরাহ করে, যা std::threadবা pthreadsনা।
স্টিফান ডলবার্গ

15
পুনরায় খুলতে ভোট দিয়েছেন। "প্রযুক্তিগত পার্থক্য" এর জন্য অনুরোধ এটিকে উদ্দেশ্যমূলকভাবে জবাবদিহি করে। উচ্চ ভোটের সংখ্যাটি ইঙ্গিত দেয় যে অন্যরা এই পোস্টটি গঠনমূলক এবং সহায়ক বলে মনে করেছে।
অ্যাড্রিয়ান ম্যাককার্টি

উত্তর:


121

আপনি যদি অনেক প্ল্যাটফর্মে কোড চালাতে চান তবে পিক্সিক থ্রেডের জন্য যান। এগুলি প্রায় সর্বত্র পাওয়া যায় এবং বেশ পরিপক্ক হয়। অন্যদিকে আপনি যদি কেবল লিনাক্স / জিসিসি ব্যবহার করেন তবে std::threadএটি পুরোপুরি ঠিক আছে - এটির উচ্চতর বিমূর্ততা স্তর রয়েছে, সত্যই একটি ভাল ইন্টারফেস এবং অন্যান্য সি ++ 11 ক্লাসের সাথে দুর্দান্ত খেলে।

সি ++ 11 std::threadশ্রেণি দুর্ভাগ্যক্রমে প্রতিটি প্ল্যাটফর্মে নির্ভরযোগ্যভাবে (এখনও) কাজ করে না, এমনকি সি ++ 11 উপলব্ধ মনে হলেও। উদাহরণস্বরূপ নেটিভ অ্যান্ড্রয়েড std::threadবা উইন 64 এ এটি ঠিক কাজ করে না বা মারাত্মক পারফরম্যান্সের বাধা (2012 হিসাবে) রয়েছে।

একটি ভাল প্রতিস্থাপন হ'ল boost::thread- এটি একেবারে অনুরূপ std::thread(আসলে এটি একই লেখকের কাছ থেকে) এবং নির্ভরযোগ্যভাবে কাজ করে তবে অবশ্যই এটি তৃতীয় পক্ষের লাইব্রেরি থেকে আরেকটি নির্ভরতা প্রবর্তন করে।


সম্পাদনা করুন: ২০১ of সালের হিসাবে, std::threadবেশিরভাগ নেটিভ অ্যান্ড্রয়েডে কাজ করে। কিছু ক্লাস, যেমন std::timed_mutexএখনও প্রয়োগ করা হয় না।


19
এই "পারফরম্যান্স বাধা" দাবীগুলি ব্যাক আপ করার কোনও প্রমাণ আছে কি? এছাড়াও, std::threadএবং এর রাই-স্টাইলটি ভাল কারণ এটি সি ++ ব্যতিক্রমগুলি পরিচালনা করতে পারে যখন পাইথ্রেডগুলি বাক্সের বাইরে থাকতে পারে না।
জেসি গুড

9
এখন 2014 এ, এই উত্তরটি এখনও কার্যকর?
নির্বিকার

25
এখন, 2017 এর শুরু সম্পর্কে কী?
rmobis

9
এখন কি হবে, ২০১ Middle এর মাঝামাঝি?
অরবিট

14
এখন কি হবে, 2018 এর মাঝামাঝি?

59

দ্য std::threadগ্রন্থাগার একটি পরিবেশ সমর্থনকারী pthreads মধ্যে pthreads উপরে বাস্তবায়িত হয় (উদাহরণস্বরূপ: libstdc ++) সাথে।

আমি মনে করি উভয়ের মধ্যে বড় পার্থক্য বিমূর্ততা। std::threadএকটি সি ++ শ্রেণীর পাঠাগার। std::threadবিশ্লেষণ করা কেশ, রিকার্সিভ mutexes, ভবিষ্যতে / প্রতিশ্রুতি নকশা প্যাটার্ন বাস্তবায়নের, এবং আরও: লাইব্রেরি অনেক বিমূর্ত বৈশিষ্ট্য, উদাহরণস্বরূপ অন্তর্ভুক্ত করা হয়েছে।


4
+1আমার কাছ থেকে সবচেয়ে গুরুত্বপূর্ণ বিষয়টি নির্দেশ করার জন্য, যথা std :: থ্রেড একটি উচ্চ স্তরের বিমূর্ততা সরবরাহ করে।
এসবিআই

33

std::thread উইন্ডোজ, ম্যাকস এবং লিনাক্সের মতো বিভিন্ন প্ল্যাটফর্ম জুড়ে বহনযোগ্যতা সরবরাহ করে।

নীচের মন্তব্যগুলিতে এবং সম্পর্কিত উত্তর https://stackoverflow.com/a/13135425/1158895std::thread তে @hirshhornsalz দ্বারা উল্লিখিত হিসাবে , এখনও সমস্ত প্ল্যাটফর্মে সম্পূর্ণ নাও হতে পারে। এমনকি এখনও, (এটি অদূর ভবিষ্যতে হবে) এটির পক্ষে pthreadহওয়া উচিত কারণ এটি আপনার অ্যাপ্লিকেশনটিকে আরও ভবিষ্যত-প্রমাণ করে তোলে।


2
আসলে, এসটিডি :: থ্রেডগুলি সমস্ত প্ল্যাটফর্মগুলিতে পোর্টিবিলিটি সরবরাহ করে যা সি ++ 11 সমর্থন করে, যখন পসিক্স থ্রেডগুলি কেবল পসিক্স প্ল্যাটফর্মগুলিতে উপলব্ধ (বা প্ল্যাটফর্মগুলি যা কিছু ন্যূনতম সামঞ্জস্যের জন্য চেষ্টা করে)।
টোবিয়াস ল্যাঙ্গনার

1
ব্যবহারিক POV থেকে এটি ঠিক ভুল। আমি কয়েক মাস আগে এই যুক্তিতে সিদ্ধান্ত নিয়েছিলাম - এটি একটি বড় ভুল ছিল। অনুশীলনে আপনাকে boost::threadউইন 64 বা বায়োনিক (অ্যান্ড্রয়েড) ব্যবহার করতে হবে , কারণ std::threadএখনও বড় অংশের অভাব রয়েছে, যেখানে লিনাক্সে std::threadযথেষ্ট পরিপক্ক বলে মনে হচ্ছে।
গুনথার পাইজ

1
@ হিড়শহর্নসাল্জ, আমার উত্তরটির মূল বিষয়টি হ'ল পাইথ্রেডের তুলনায় সি ++ 11 থ্রেড প্রয়োগের দ্বারা সরবরাহিত বহনযোগ্যতার সুবিধাটি উল্লেখ করা। ওপি বৃদ্ধির বিষয়ে জিজ্ঞাসা করে না, তবে এটির বহনযোগ্যও।
ব্র্যাডি

3
@ হিড়্সহর্নসালজ, আপনার নেতিবাচক সুর এবং কখনও থ্রেড ব্যবহার না করার অভিযোগের জন্য, তারা কেবল অনর্থক এবং আমার পক্ষ থেকে প্রচেষ্টার প্রাপ্য নয়। আমি মনে করি এটির অন্তত সার্থক যে আপনি আরও প্লাটফর্মে স্টাড :: থ্রেড ব্যবহার করার চেষ্টা করেছিলেন এমন সমস্যাগুলি উল্লেখ করার জন্য আরও গঠনমূলক মন্তব্য করা উচিত।
ব্র্যাডি

3
সংক্ষিপ্তসার হিসাবে, সি ++ 11 স্ট্যান্ড :: থ্রেড কেবলমাত্র জিসিসির সাম্প্রতিক সংস্করণগুলির সাথে ব্যবহারযোগ্য। এটি ভিজ্যুয়াল স্টুডিওতে প্রায় সম্পূর্ণ নয়, সুতরাং উইন্ডোজটিতে ব্যবহারযোগ্য নয় able এবং অবশ্যই এটি ইউনিক্সের বাণিজ্যিক সংকলকগুলিতে একেবারে নিখোঁজ রয়েছে (সোলারিসের উপর সান স্টুডিও, এইচপি-ইউএক্সে এইচপির দুদক, এআইএক্সের আইবিএম ফাঁকা)। অতএব, যদি আপনার টার্গেট প্ল্যাটফর্মটি কেবল লিনাক্স হয় - c ++ 11 স্টাড :: থ্রেড ঠিক আছে; আপনার যদি উইন্ডোজ বা অন্যান্য ইউনিক্স - বুস্ট :: থ্রেডের প্রয়োজন হয় তবেই যেতে হবে।
ভোর

7

আমার পক্ষে সিদ্ধান্ত নেওয়া প্রযুক্তিগত পার্থক্য হ'ল স্ট্র্যাডের বিপরীতে স্ট্যান্ডার্ডে সিগন্যাল হ্যান্ডলিং আদিমদের অনুপস্থিতি। একা একা স্ট্যান্ড ব্যবহার করে ইউনিক্স প্রসেসে সিগন্যাল হ্যান্ডলিংকে সঠিকভাবে নির্দেশ করতে অক্ষমতা হ'ল স্টাড :: থ্রেডের ব্যবহারে দুর্বল ত্রুটি এএফআইকে এটি একটি উত্সর্গীকৃত সমস্ত সংকেতকে প্রক্রিয়াজাত করতে বোনা ফাইড মাল্টি-থ্রেড সিগন্যাল হ্যান্ডলিং প্যাটার্ন স্থাপন থেকে বিরত রাখে one থ্রেড করুন এবং বাকীগুলিতে তাদের ব্লক করুন। আপনাকে স্টাড :: থ্রেডটি pthreads ব্যবহার করে প্রয়োগ করা হবে এবং pthread_sigmask ব্যবহার করার সময় সেরাের জন্য আশা করা বাধ্য করা হবে। সংস্থাগুলি সঠিকভাবে পরিচালনা করা এন্টারপ্রাইজের জন্য ইউনিক্স সিস্টেম প্রোগ্রামিংয়ে অ-আলোচনাযোগ্য।

২০১ at সালের হিসাবে, স্টাড :: থ্রেড একটি খেলনা; যে হিসাবে সহজ।


7
আমি একমত নই এবং সংকেতগুলির ভারী ব্যবহার হ'ল একটি নকশার ধরণ যা বেশিরভাগ অ্যাপ্লিকেশনগুলির জন্য এড়ানো যায়।
এরিক আলাপ

এছাড়াও, std::threadপ্রকারে সুরক্ষা এনে দেয় যা প্রাইথ্রেডের নেই।
alfC

-3

ওপেনএমপি

http://www.openmp.org/

এটি একটি স্ট্যান্ডার্ডাইজড, এসএমপি ভিত্তিক মাল্টিথ্রেডিং স্ট্যান্ডার্ড যা ইতিমধ্যে এক দশক ধরে লিনাক্স এবং উইন্ডোজে কাজ করছে। ওপেনএমপি জিসিসি এবং মাইক্রোসফ্ট ভিজ্যুয়াল স্টুডিও সহ সমস্ত সংকলকগুলির সাথে ডিফল্টরূপে উপলব্ধ।

ওপেনএমপি ব্যবহার করার সময় একটি বিষয় লক্ষ্য রাখতে হবে, সিপিইউ-কোরের তুলনায় যদি আরও থ্রেড থাকে তবে প্রাসঙ্গিক পরিবর্তন ওভারহেডের প্রসঙ্গে সুইচিংয়ের কারণে কর্মক্ষমতা হ্রাস পাবে। দ্বিতীয় জিনিসটি মনে রাখবেন যে একটি বাস্তব, অপারেটিং সিস্টেমের স্তর, থ্রেডের তুলনা তুলনামূলকভাবে ব্যয়বহুল। প্রারম্ভিককরণটি একটি সেকেন্ডের ভগ্নাংশ, তবে কিছু অ্যাপ্লিকেশনগুলিতে খুব সামান্য ভগ্নাংশই যথেষ্ট ব্যয় করে।

সম্পর্কিত সফ্টওয়্যার আর্কিটেকচার প্রয়োজনীয়তার জন্য আপনি ওপেনএমপি ব্যবহারের স্থলে "লাইটওয়েট থ্রেড" বা "সবুজ থ্রেড" এর কিছু বাস্তবায়ন সন্ধান করতে চাইতে পারেন। পার্থক্যটি হ'ল ওপেনএমপি থ্রেডগুলি আসল, অপারেটিং সিস্টেমের স্তর, থ্রেডগুলি তবে "সবুজ থ্রেড" কেবল "সিমুলেটেড থ্রেড" হতে পারে যা কিছু সংখ্যক বাস্তব সংখ্যক থ্রেড ব্যবহার করে সম্পাদিত হয়।


6
সম্মানহীনতা নেই, তবে এটি মূল প্রশ্নের সাথে কীভাবে সম্পর্কিত?
এসআরজি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.