c++ - موضوع - هل تحليل البول يكشف الامراض التناسلية




C++ 11: الأمراض المنقولة جنسيا:: موضوع المجمعة؟ (3)

أولاً ، كما ذكرت ، لا يحدد معيار C ++ بشكل أساسي تنفيذ المكتبة. لكن يجب أن يطبق أحد مطوري مكتبة C ++ القياسية قاعدة "كما لو".

على سبيل المثال ، فهذا يعني أن مُنشئ std::thread يجب أن يتصرف كما لو أن الخيط الجديد قد تم إنشاؤه سواء كان عبارة عن غلاف رفيع لواجهة برمجة التطبيقات الأساسية أو تطبيق فعال مثل تجمع الخيط. (هنا ، تعني كلمة "خيط" مؤشر ترابط مجردة للتنفيذ في مواصفات C ++ 11 ، وليس خيط تشغيل أصلي ملموس لنظام التشغيل)

على تطبيق تجمع مؤشرات الترابط ؛

  • يجب أن يعامل برنامج التحويل البرمجي C ++ والمكتبة الموارد المحددة لمؤشر ترابط C ++ (أي متغير thread_local ) ، ويجب أن يعملوا معًا في وقت التشغيل.
  • حتى إذا تم استيفاء الشرط أعلاه ، يبدو أنه من المستحيل التعاون مع موارد سلاسل عمليات نظام التشغيل المحددة (TLS لنظام التشغيل Windows ، و TSS لبرنامج pthread ، وما إلى ذلك).

لذلك ، افترض أن معظم تطبيق std::thread مجرد التفاف لواجهة برمجة التطبيقات الأساسية للتسلسل.

في C ++ 03 ، استخدمتُ pthread مع تجمع مؤشرات ترابط مُدمج ذاتيًا احتفظ دائمًا بمجموعة من مؤشرات الترابط قيد التشغيل (نظرًا لأن pthread_create بطيء) ، وبهذه الطريقة تمكنت من تشغيل pthread_create للمهام الصغيرة دون التفكير في مشكلات الأداء.

الآن ، في C ++ 11 لدينا std::thread . أعتقد أن المعيار لا يقول أي شيء عن التنفيذ المحدد ، لذلك سؤالي يتعلق بالتطبيقات القياسية للمكتبة. هل يختارون عمومًا اتباع نهج مجمع حيث يكون إنشاء std::thread s رخيصًا (على سبيل المثال لا يستدعي pthread_create على posix) ، أم هل سيكون std::thread مجرد غلاف؟

بمعنى آخر ، هل ما زال يوصى std::thread في الإصدار C ++ 11 ، أم هل ينبغي علي إنشاء std::thread عند الحاجة ، وترك أداء يصل إلى المكتبة القياسية؟


بشكل عام ، يجب أن يكون std::thread بسيطًا حول النظام الأساسي الأساسي. على سبيل المثال ، إذا كنت تستخدم نظام pthread ، يمكنك اختبار البرنامج التالي أنه بغض النظر عن عدد مؤشرات الترابط التي تقوم بإنشائها ، يتم إنشاؤها pthread_t بمعرفات pthread_t فريدة من نوعها (مما يعني أنها قد تم إنشاؤها على الطاير ولا يتم استعارتها من تجمع موضوع):

#include <assert.h>
#include <mutex>
#include <set>
#include <thread>
#include <vector>

#include <pthread.h>

int main() {
  std::vector<std::thread> workers;
  std::set<long long> thread_ids;
  std::mutex m;
  const int n = 1024;

  for (int i = 0; i < n; ++i) {
    workers.push_back(std::thread([&] {
      std::lock_guard<std::mutex> lock(m);
      thread_ids.insert(pthread_self());
    }));
  }
  for (auto& worker : workers) {
    worker.join();
  }
  assert(thread_ids.size() == n);

  return 0;
}

حتى تجمعات موضوع لا يزال المنطقي الكمال. ومع ذلك ، رأيت مقطع فيديو ناقش فيه أعضاء لجنة C ++ تجمعات الخيط فيما يتعلق std::async (IIRC) ، لكنني لم أجدها الآن.


std::thread هو مؤشر ترابط التنفيذ. فترة. من أين يأتي ، وكيف يصل إلى هناك ، سواء كان هناك مجموعة من الخيوط "الفعلية" ، وما إلى ذلك ، لا صلة له بالمعيار. طالما يتصرف مثل مؤشر ترابط ، فقد يكون std::thread .

الآن ، هناك احتمالات جيدة لأن std::thread هو مؤشر ترابط نظام تشغيل حقيقي ، وليس شيئًا تم سحبه من تجمع مؤشرات الترابط أو أيًا كان. لكن C ++ 11 يسمح نظريًا بتنفيذ std::thread كشيء تم سحبه من مجموعة.





stdthread