pthreads
في مجال الحوسبة ، تُعدّ خيوط POSIX ، المعروفة اختصارًا بـ pthreads (نسبةً إلى ملف رأسها <pthread.h> )، نموذج تنفيذ مستقل عن لغة البرمجة ، كما أنها نموذج تنفيذ متوازٍ . تُمكّن هذه الخيوط البرنامج من التحكم في تدفقات عمل متعددة ومتداخلة زمنيًا. يُشار إلى كل تدفق عمل باسم " خيط" ، ويتم إنشاء هذه التدفقات والتحكم بها من خلال استدعاء واجهة برمجة تطبيقات خيوط POSIX . خيوط POSIX هي واجهة برمجة تطبيقات مُعرّفة في معيار معهد مهندسي الكهرباء والإلكترونيات (IEEE) POSIX .1c، امتدادات الخيوط (IEEE Std 1003.1c-1995) .
تتوفر تطبيقات واجهة برمجة التطبيقات (API) على العديد من أنظمة التشغيل المتوافقة مع معيار POSIX الشبيهة بنظام Unix ، مثل FreeBSD و NetBSD و OpenBSD و Linux و macOS و Android [ 1 ] وSolaris و Redox و QNX و AUTOSAR Adaptive، وعادةً ما تكون مُجمّعة كمكتبة libpthread . كما توجد تطبيقات لأنظمة DR-DOS و Microsoft Windows : ضمن النظام الفرعي SFU/SUA الذي يوفر تطبيقًا أصليًا لعدد من واجهات برمجة تطبيقات POSIX، وأيضًا ضمن حزم خارجية مثل pthreads-w32 [ 2 ] ، التي تُطبّق pthreads على واجهة برمجة تطبيقات Windows الحالية .
محتويات
تُعرّف مكتبة pthreads مجموعة من أنواع البيانات والدوال والثوابت الخاصة بلغة البرمجة C. ويتم تنفيذها باستخدام ملف رأس ومكتبة خيوط .pthread.h
يوجد حوالي 100 إجراء متسلسل، جميعها مسبوقة ببادئات pthread_، ويمكن تصنيفها إلى خمس مجموعات:
- إدارة سلاسل المحادثات – إنشاء سلاسل المحادثات، وربطها، وما إلى ذلك.
- التزامن المتبادل
- متغيرات الحالة
- التزامن بين الخيوط باستخدام أقفال القراءة والكتابة والحواجز
- أقفال الدوران [ 3 ]
تعمل واجهة برمجة تطبيقات الإشارات الثنائية POSIX مع سلاسل عمليات POSIX، ولكنها ليست جزءًا من معيار سلاسل العمليات، حيث تم تعريفها في معيار POSIX.1b، ملحقات الوقت الحقيقي (IEEE Std 1003.1b-1993) . ونتيجة لذلك، تُسبق إجراءات الإشارات الثنائية بـ sem_بدلاً من pthread_.
مثال
مثال يوضح استخدام مكتبة pthreads في لغة C:
#include <assert.h> #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h>#define NUM_THREADS 5void * perform_work ( void * arguments ){ int index = * (( int * ) arguments ); int sleep_time = 1 + rand () % NUM_THREADS ; printf ( "Thread %d: Started. \n " , index ); printf ( "Thread %d: Will be sleeping for %d seconds. \n " , index , sleep_time ); sleep ( sleep_time ); printf ( "Thread %d: Ended. \n " , index ); return NULL ; }int main ( void ) { pthread_t threads [ NUM_THREADS ]; int thread_args [ NUM_THREADS ]; int result_code ; // إنشاء جميع الخيوط واحدًا تلو الآخر for ( int i = 0 ; i < NUM_THREADS ; i ++ ) { printf ( "في الدالة الرئيسية: إنشاء الخيط %d. \n " , i ); thread_args [ i ] = i ; result_code = pthread_create ( & threads [ i ], NULL , perform_work , & thread_args [ i ]); assert ( ! result_code ); }printf ( "في الدالة الرئيسية: تم إنشاء جميع الخيوط. \n " );// انتظر حتى يكتمل كل خيط for ( int i = 0 ; i < NUM_THREADS ; i ++ ) { result_code = pthread_join ( threads [ i ], NULL ); assert ( ! result_code ); printf ( "في البرنامج الرئيسي: انتهى الخيط %d. \n " , i ); }printf ( "انتهى البرنامج الرئيسي. \n " ); return 0 ; }ينشئ هذا البرنامج خمسة خيوط، يُنفّذ كل منها الدالة `perform_work` التي تطبع الرقم الفريد لهذا الخيط على المخرج القياسي. إذا أراد المبرمج أن تتواصل الخيوط فيما بينها، فسيتطلب ذلك تعريف متغير خارج نطاق أي من الدوال، ليصبح متغيرًا عامًا . يمكن تجميع هذا البرنامج باستخدام مُجمِّع gcc بالأمر التالي:
gcc pthreads_demo.c -pthread -o pthreads_demo
إليك أحد المخرجات العديدة المحتملة من تشغيل هذا البرنامج.
في البرنامج الرئيسي: إنشاء الخيط 0. في البرنامج الرئيسي: إنشاء الخيط 1. في البرنامج الرئيسي: إنشاء الخيط 2. في البرنامج الرئيسي: إنشاء الخيط 3. الخيط 0: بدأ. في البرنامج الرئيسي: إنشاء الخيط 4. الخيط 3: بدأ. الخيط 2: بدأ. الخيط 0: سيبقى في وضع السكون لمدة 3 ثوانٍ. الخيط 1 : بدأ. الخيط 1: سيبقى في وضع السكون لمدة 5 ثوانٍ. الخيط 2: سيبقى في وضع السكون لمدة 4 ثوانٍ. الخيط 4: بدأ. الخيط 4: سيبقى في وضع السكون لمدة ثانية واحدة. في البرنامج الرئيسي: تم إنشاء جميع الخيوط. الخيط 3: سيبقى في وضع السكون لمدة 4 ثوانٍ. الخيط 4: انتهى. الخيط 0: انتهى. في البرنامج الرئيسي: انتهى الخيط 0. الخيط 2: انتهى. الخيط 3: انتهى. الخيط 1: انتهى. في البرنامج الرئيسي: انتهى الخيط 1. في البرنامج الرئيسي: انتهى الخيط 2. في البرنامج الرئيسي: انتهى الخيط 3. في البرنامج الرئيسي: انتهى الخيط 4. انتهى البرنامج الرئيسي.خيوط POSIX لنظام التشغيل Windows
لا يدعم نظام ويندوز معيار pthreads بشكلٍ أصلي؛ لذا، يسعى مشروع Pthreads4w إلى توفير تطبيق وسيط قابل للنقل ومفتوح المصدر . كما يُمكن استخدامه لنقل برامج يونكس (التي تستخدم pthreads) إلى منصة ويندوز مع تعديلات طفيفة أو بدون أي تعديلات. [ 4 ] يتوافق الإصدار 3.0.0 من Pthreads4w [ 5 ] أو أحدث، المُرخص بموجب رخصة أباتشي العامة الإصدار 2.0، مع أنظمة ويندوز 64 بت و32 بت. كما يتوافق الإصدار 2.11.0 [ 6 ] ، المُرخص بموجب رخصة LGPLv3، مع أنظمة 64 بت و32 بت.
يحتوي مشروع Mingw-w64 أيضًا على تطبيق غلاف لـ 'pthreads، وهو winpthreads ، والذي يحاول استخدام المزيد من استدعاءات النظام الأصلية مقارنةً بمشروع Pthreads4w. [ 7 ]
يوفر النظام الفرعي لبيئة Interix، المتوفر في حزمة Windows Services for UNIX/Subsystem for UNIX-based Applications، منفذًا أصليًا لواجهة برمجة تطبيقات pthreads، أي أنه غير مرتبط بواجهة برمجة تطبيقات Win32 ولكنه مبني مباشرة على واجهة استدعاء النظام لنظام التشغيل . [ 8 ]
انظر أيضاً
- نظام التشغيل
- OpenMP
- سيلك / سيلك بلس
- ربط لبنات البناء (TBB)
- مكتبة خيوط POSIX الأصلية (NPTL)
- DCEThreads
- الاستنساخ (استدعاء نظام لينكس)
- استيقاظ زائف
- التخزين المحلي للخيط
- خيوط GNU المحمولة
- جراند سنترال ديسباتش (مكتبة سلاسل الرسائل الخاصة بشركة أبل)
- سلاسل الحالة ، وهي منهجية تعتمد على الأحداث في إدارة السلاسل
مراجع
- ↑ "libc/bionic/pthread.c - platform/bionic - Git at Google" . android.googlesource.com .
- ↑ "Pthread Win-32: مستوى مطابقة المعايير" . 22-12-2006. مؤرشف من الأصل في 11-06-2010 . تم الاطلاع عليه في 29-08-2010 .
- ↑ "pthread.h(0p) — صفحة دليل لينكس" . تم الاطلاع عليه بتاريخ 18 ديسمبر 2022 .
- ↑ هارت، جونسون م. (21-11-2004). "تجارب مع مكتبة Pthreads مفتوحة المصدر وبعض التعليقات" . مؤرشف من الأصل في 30-08-2010 . تم الاطلاع عليه في 29-08-2010 .
- ↑ الملف: pthreads4w-code-v3.0.0.zip – مصدر pthreads4w الإصدار 3.0.0
- ↑ الملف: pthreads4w-code-v2.11.0.zip – مصدر pthreads4w الإصدار 2.11.0
- ↑ انظر http://locklessinc.com/articles/pthreads_on_windows حيث تم اشتقاقها في الأصل
- ↑ "الفصل 1: مقدمة إلى خدمات ويندوز لنظام يونكس 3.5" . 5 ديسمبر 2007.
للمزيد من القراءة
- ديفيد ر. بوتنهوف (1997). البرمجة باستخدام خيوط POSIX . أديسون-ويسلي. ISBN 978-0-201-63392-4.
- برادفورد نيكولز؛ ديك باتلار؛ جاكلين برولكس فاريل (سبتمبر 1996). برمجة Pthreads . دار نشر أورايلي وشركاؤه. رقم ISBN 978-1-56592-115-3.
- تشارلز ج. نورثروب (25 يناير 1996). البرمجة باستخدام خيوط يونكس . جون وايلي وأولاده. رقم ISBN 978-0-471-13751-1.
- كاي أ. روبنز وستيفن روبنز (2003). برمجة أنظمة يونكس . برنتيس هول. ISBN 978-0-13-042411-2.
روابط خارجية
- مكتبة C POSIX
- الحوسبة المتوازية
- الخيوط (الحوسبة)
