الجمع بين شوكة pthread-win32
لـ RedFox20 + Oktonion + WinBuild
تغييرات PThread https://github.com/WinBuilds/pthread-win32:
هذا هو شوكة الإصدار 2.10.0.0 من حزمة pthreads-win32. يختلف ABI لهذه الشوكة عن الأصل.
التغييرات التي تمت:
تم تغيير نوع عداد إعادة الاستخدام في ptw32_handle_t
من int
إلى size_t
لتسهيل تشغيل الخوادم لفترة طويلة.
تمت إزالة العناصر غير المستخدمة من pthread_once_t
يتم اختبار هذه المكتبة بشكل متكرر مع مشاريعنا الأخرى في Visual Studio 2022.
بشكل عام أستخدم (ولقد استخدمت) ملفات مشروع MSVC20xx لعملي. تم استخدام ملفات Makefiles بشكل أقل تكرارًا وقد تكون قديمة.
يرجى ملاحظة رسالة الالتزام d4b0ef6b: على الرغم من أن مشروع MSVC2022/2019 قد تم تكوينه ليناسب إعداداتي الداخلية طوال الوقت، إلا أنه قد لا يناسب إعداداتك.
يمكنك، بالطبع، تحرير الإعدادات يدويًا دائمًا، ولكن عندما تحتاج إلى القيام بذلك للعديد من ملفات مشروع vcxproj
، فقد تكون البرمجة النصية للمهمة هي الحل الأمثل. راجع update-vcxproj.js
و patch-vcxproj.js
للحصول على نماذج البرامج النصية التي تقوم بهذا النوع من الأشياء. أستخدمها للتأكد من أن جميع مشاريع C/C++ الخاصة بي لديها نفس إعدادات البناء تمامًا، لذلك لا أحصل على أي مفاجآت سيئة في وقت التشغيل لأن بعض المشاريع قررت الإنشاء باستخدام مكتبات Debug/Release Static/DLL Run Time Libraries المختلفة قليلاً، وما إلى ذلك: هناك ملايين الطرق التي يمكنك الحصول عليها؟؟ بواسطة نظام البناء الخاص بك في بيئة Windows. هزار! ؟
(2021-12-17)
هذا إصدار صغير يحتوي في الغالب على إصلاحات إدارية.
mkdir b && cd b && cmake -G "Visual Studio 16 2019" ..
: حسنًا. هذا يعني أنه تم إصلاح العديد من الأخطاء الكامنة وقمنا بتضمين حل بديل لبرنامج CMake (ما زلت لا أحب هذه الأداة) عندما يتم تجميع مصادر C بشكل مشروط كـ C++ (انظر أيضًا pthread-EH.cpp) وpthread-JMP.c: ملفان مصدريان جديدان للمجمّع). هذا إصدار صغير يحتوي في الغالب على إصلاحات إدارية.
تم اختبار إصدارات MSVC وMinGW64 على بنية SMP (Intel x64 Hex Core) من خلال استكمال مجموعة الاختبار المضمنة، بالإضافة إلى اختبارات التحمل والمقعد.
تأكد من تشغيل تصميماتك مقابل مجموعة الاختبار. إذا رأيت حالات فشل، فيرجى التفكير في كيفية مساهمة سلاسل الأدوات الخاصة بك في الفشل. راجع ملف README للحصول على أوصاف أكثر تفصيلاً لسلاسل الأدوات وأنظمة الاختبار التي استخدمناها لاجتياز الاختبارات بنجاح.
نوصي باستخدام MinGW64 عبر MinGW لكل من إصدارات GNU CC 64 و32 بت فقط لأن معالجة استثناء MinGW DWARF2 مع إصدارات C++ تسبب بعض المشكلات في إلغاء سلسلة الرسائل.
يتضمن MinGW64 أيضًا تطبيق pthreads الأصلي الخاص به، والذي قد تفضل استخدامه. إذا كنت ترغب في إنشاء مكتبتنا، فستحتاج إلى تحديد خيار سلاسل Win32 الأصلية في وقت التثبيت. نوصي أيضًا بتحديد طريقة معالجة استثناء SJLJ لإصدارات MinGW64-w32. بالنسبة إلى MinGW64-w64، يجب أن تعمل طريقة معالجة الاستثناء SJLJ أو SEH.
(2018/08/08)
لاحظ أن هذا إصدار رئيسي جديد. تقدم الزيادة الرئيسية في الإصدار تغييرين في واجهة برمجة التطبيقات (ABI) إلى جانب تغييرات التسمية الأخرى التي ستتطلب إعادة ترجمة تطبيقات الارتباط وربما بعض التغييرات النصية لمراجع الماكرو في وقت الترجمة في ملفات التكوين والمصدر، على سبيل المثال تغييرات PTW32_* إلى PTW32_ ، وptw32_ إلى ptw32_*، وما إلى ذلك .
بموافقة جميع المساهمين الأساسيين ذوي الصلة، يتم إصدار الإصدار 3 من pthreads-win32 / pthreads4w، باستثناء أربعة ملفات، بموجب شروط ترخيص Apache v2.0. يتوافق APLv2 مع تراخيص GPLv3 وLGPLv3 وبالتالي قد يستمر تضمين هذا الرمز بشكل قانوني ضمن مشاريع GPLv3 وLGPLv3.
تم تعريف المساهم الكبير ذي الصلة على أنه الشخص الذي ساهم بالرمز الأصلي الذي ينفذ القدرة الموجودة في الإصدارات من الآن فصاعدا. يستثني هذا العديد من المساهمين الذين ساهموا بتعليمات برمجية أصبحت قديمة، أو قدموا تصحيحات تعمل على إصلاح الأخطاء، أو إعادة تنظيم التعليمات البرمجية لأغراض جمالية أو عملية، أو تحسين عمليات البناء. كان هذا التمييز ضروريًا للمضي قدمًا في احتمال عدم إمكانية الاتصال بجميع المساهمين. يتم إدراج كافة المساهمين في ملف المساهمين.
الملفات الأربعة التي ستبقى LGPL ولكن تتغير إلى الإصدار v3 هي ملفات مستخدمة لتكوين إصدارات بيئة GNU:
aclocal.m4
configure.ac
GNUmakefile.in
tests/GNUmakefile.in
المساهمون الذين طلبوا هذا التغيير أو وافقوا عليه عند استشارتهم هم:
ستظل إصدارات pthreads-win32 / pthreads4w الإصدار 2 LGPL ولكن سيتم إصدار الإصدار 2.11 والإصدارات الأحدث ضمن الإصدار 3 من هذا الترخيص، بحيث لن تؤدي أي إضافات إلى كود الإصدار 3 من pthreads4w الذي تم نقله خلفيًا إلى الإصدار 2 إلى تلويث هذا الرمز.
قد لا تكون بعض التغييرات بدءًا من 26 فبراير 2011 فصاعدًا متوافقة مع أنظمة ما قبل Windows 2000.
لم يتم تطبيق إصلاحات الأخطاء الجديدة في كافة الإصدارات منذ 2.8.0 على السلسلة 1.xx.
تم اختبار إصدارات MSVC وMinGW وMinGW64 على بنية SMP (Intel x64 Hex Core) من خلال استكمال مجموعة الاختبار المضمنة، بالإضافة إلى اختبارات التحمل والمقعد.
تأكد من تشغيل تصميماتك مقابل مجموعة الاختبار. إذا رأيت حالات فشل، فيرجى التفكير في كيفية مساهمة سلاسل الأدوات الخاصة بك في الفشل. راجع ملف README للحصول على أوصاف أكثر تفصيلاً لسلاسل الأدوات وأنظمة الاختبار التي استخدمناها لاجتياز الاختبارات بنجاح.
نوصي باستخدام MinGW64 عبر MinGW لكل من إصدارات GNU CC 64 و32 بت فقط لأن معالجة استثناء MinGW DWARF2 مع إصدارات C++ تسبب بعض المشكلات في إلغاء سلسلة الرسائل.
يتضمن MinGW64 أيضًا تطبيق pthreads الأصلي الخاص به، والذي قد تفضل استخدامه. إذا كنت ترغب في إنشاء مكتبتنا، فستحتاج إلى تحديد خيار سلاسل Win32 الأصلية في وقت التثبيت. نوصي أيضًا بتحديد طريقة معالجة استثناء SJLJ لإصدارات MinGW64-w32. بالنسبة إلى MinGW64-w64، يجب أن تعمل طريقة معالجة الاستثناء SJLJ أو SEH.
بخلاف ما يلي، يعد هذا الإصدار مكافئًا للإصدار 2.11.0.
يقدم هذا الإصدار تغييرًا على pthread_t وpthread_once_t مما سيؤثر على التطبيقات المرتبطة بالمكتبة.
pthread_t: يظل بنية ولكنه يوسع عداد إعادة الاستخدام من 32 بت إلى 64 بت. في أجهزة 64 بت، لن يزيد الحجم الإجمالي للكائن، فنحن ببساطة نضع 4 بايت من المساحة المتروكة للاستخدام الجيد مما يقلل من خطر التفاف العداد في التطبيقات طويلة التشغيل جدًا من الصغيرة إلى الصفر بشكل فعال. يعمل عداد إعادة الاستخدام 64 بت على تمديد وقت التشغيل الخالي من المخاطر من أشهر (بافتراض متوسط عمر الخيط 1 مللي ثانية) إلى قرون (بافتراض متوسط عمر الخيط 1 نانو ثانية).
pthread_once_t: إزالة عنصرين قديمين وتقليل حجمهما.
(2018/08/08)
لم يتم تطبيق إصلاحات الأخطاء الجديدة في كافة الإصدارات منذ 2.8.0 على السلسلة 1.xx.
قد لا تكون بعض التغييرات بدءًا من 26 فبراير 2011 فصاعدًا متوافقة مع أنظمة ما قبل Windows 2000.
سيتم إصدار الإصدار 2.11 من pthreads-win32 / pthreads4w وجميع إصدارات 2.x المستقبلية بموجب ترخيص GNU العام الإصدار 3 (LGPLv3).
سيتم إصدار الإصدار الرئيسي التالي من هذا البرنامج (الإصدار 3) ضمن ترخيص Apache الإصدار 2.0 (ALv2). سيسمح إصدار 2.11 ضمن LGPLv3 بإعادة تعديلات الإصدار 3 من هذا البرنامج إلى الإصدار 2 من الآن فصاعدًا. علاوة على ذلك، فإن أي مشاريع GPL تستخدم هذه المكتبة حاليًا ستكون قادرة على الاستمرار في استخدام الإصدار 2 أو 3 من هذا الكود في مشاريعها.
لمزيد من المعلومات، يرجى الاطلاع على: https://www.apache.org/licenses/GPL-compatibility.html
من أجل البقاء متسقًا مع هذا التغيير، من الآن فصاعدًا، لن يتم قبول التعديلات على هذه المكتبة إلا مقابل الإصدار 3 من هذا البرنامج بموجب شروط ALv2. سيتم بعد ذلك، عند الاقتضاء، إعادتها إلى الإصدار 2.
نأمل أن نصدر الإصدار 3 في نفس الوقت الذي نصدر فيه الإصدار 2.11.
تم اختبار هذا الإصدار على بنية SMP (Intel x64 Hex Core) من خلال استكمال مجموعة الاختبار المضمنة، بالإضافة إلى اختبارات التحمل والمقعد.
تأكد من تشغيل تصميماتك مقابل مجموعة الاختبار. إذا رأيت حالات فشل، فيرجى التفكير في كيفية مساهمة سلاسل الأدوات الخاصة بك في الفشل. راجع ملف README للحصول على أوصاف أكثر تفصيلاً لسلاسل الأدوات وأنظمة الاختبار التي استخدمناها لاجتياز الاختبارات بنجاح. نوصي باستخدام MinGW64 بدلاً من MinGW32 لكل من إصدارات GNU CC 64 و32 بت. يتضمن MinGW64 أيضًا تطبيق pthreads المستقل الخاص به، والذي قد تفضل استخدامه.
بالنسبة لإصدارات سلسلة أدوات Microsoft: (1) يتطلب الارتباط الثابت تجميع كل من هذه المكتبة وأي مكتبات أو تطبيقات ربط باستخدام /MT بشكل متسق.
(2) تمت إعادة تسمية المكتبات الثابتة باسم libpthreadV*.lib لتمييزها عن مكتبات DLL المستوردة pthreadV*.lib.
(3) إذا كنت تستخدم رابطًا مختلطًا، على سبيل المثال، ربط إصدار /MT الثابت من المكتبة بتطبيق مرتبط بـ /MD، فقد تتمكن من استخدام GetLastError() لاستجواب رمز الخطأ لأن المكتبة تحدد كلا من errno (عبر _set_errno ()) وSetLastError ().
قم بإزالة محاولة تعيين PTW32_USES_SEPARATE_CRT في الرؤوس والتي يمكن أن تسبب نتائج غير متوقعة. في بعض المواقف، قد يرغب المستخدم في تعريفه بشكل صريح في بيئته لاستدعاء تأثيراته، إما عند إنشاء المكتبة أو التطبيق أو كليهما. راجع الملف التمهيدي.غير قابل للنقل. - روس جونسون
يجب أن تكون المكتبة أكثر موثوقية في ظل السيناريوهات المرتبطة بشكل ثابت بالكامل. ملاحظة: لقد قمنا بإزالة كود PIMAGE_TLS_CALLBACK وعدنا إلى الطريقة السابقة التي تبدو أكثر موثوقية عبر جميع إصدارات المترجم.
تصحيحات مختلفة لملف GNUmake. على الرغم من أن هذا الملف قد تمت إزالته، إلا أنه من أجل اكتمال التغييرات تم تسجيلها على أنها التزامات في المستودع.
يعرّف MinGW64-w64 pid_t كـ __int64. sched.h الآن يعكس ذلك.
تم إصلاح العديد من الاختبارات التي تبين فشلها على الأجهزة تحت الحمل. الاختبارات الأخرى التي استخدمت آليات بدائية مماثلة لمزامنة الخيوط (هذه هي اختبارات الوحدة) تم تطبيق نفس التحسينات عليها: يتعرف semaphore5.c على أن sem_destroy يمكنه إرجاع EBUSY بشكل شرعي؛ قام كل من mutex6*.c وmutex7*.c وmutex8*.c باستبدال Sleep() واحد بحلقة استقصاء.
(2016/09/18)
لم يتم تطبيق إصلاحات الأخطاء الجديدة في كافة الإصدارات منذ 2.8.0 على السلسلة 1.xx.
قد لا تكون بعض التغييرات بدءًا من 26 فبراير 2011 فصاعدًا متوافقة مع أنظمة ما قبل Windows 2000.
تم اختبار هذا الإصدار على بنية SMP (Intel x64 Hex Core) من خلال استكمال مجموعة الاختبار المضمنة، بالإضافة إلى اختبارات التحمل والمقعد.
تأكد من تشغيل تصميماتك مقابل مجموعة الاختبار. إذا رأيت حالات فشل، فيرجى التفكير في كيفية مساهمة سلاسل الأدوات الخاصة بك في الفشل. راجع ملف README للحصول على أوصاف أكثر تفصيلاً لسلاسل الأدوات وأنظمة الاختبار التي استخدمناها لاجتياز الاختبارات بنجاح. نوصي باستخدام MinGW64 عبر MinGW32 لكل من إصدارات GNU CC 64 و32 بت. يتضمن MinGW64 أيضًا تطبيق pthreads المستقل الخاص به، والذي قد تفضل استخدامه.
إجراءات جديدة: pthread_timedjoin_np() pthread_tryjoin_np()
sched_getaffinity() sched_setaffinity() pthread_getaffinity_np() pthread_setaffinity_np() pthread_attr_getaffinity_np() pthread_attr_setaffinity_np()
pthread_getname_np() pthread_setname_np() pthread_attr_getname_np() pthread_attr_setname_np()
pthread_win32_getabstime_np()
تتمتع بيئات مترجم GNU (MinGW32 وMinGW64) الآن بخيار استخدام autoconf لتكوين البناء تلقائيًا.
البنيات: تمت إضافة أهداف makefile جديدة وتعديل الأهداف الموجودة أو إزالتها. على سبيل المثال، الأهداف هي بناء واختبار كافة التكوينات الممكنة لكل من dll و libs الثابتة.
تستخدم إصدارات برنامج التحويل البرمجي GNU الآن بشكل صريح التوافق مع معايير ISO C وC++ 2011. إذا كان مترجم GNU الخاص بك لا يدعم هذا، فيرجى التفكير في التحديث. أصبح التكوين التلقائي ممكنًا الآن عبر البرنامج النصي "configure". يجب إنشاء البرنامج النصي باستخدام autoconf - راجع ملف README. شكرًا لكيث مارشال من مشروع MinGW.
الارتباط الثابت: تم نقل الوظيفة التلقائية إلى dll.c، وتم توسيعها بحيث لم تعد الإصدارات التي تستخدم MSVC8 والإصدارات الأحدث تتطلب من التطبيقات الاتصال بـ pthread_win32_thread_detach_np(). أي أن جميع وظائف DllMain أصبحت الآن تلقائية للارتباط الثابت لهذه الإصدارات.
تم تعطيل بعض أهداف الارتباط الثابتة nmake: نظرًا لوجود مشكلة في سلوك TLS، تم تعطيل أهداف V*-small-static* nmake في Makefile. تم الكشف عن المشكلة عن طريق الاختبارات/semaphore3.c حيث يفشل استدعاء pthread_self() داخل مؤشر الترابط في إرجاع مقبض مؤشر ترابط POSIX الصحيح ولكنه يُرجع مؤشر ترابط POSIX "ضمنيًا" جديدًا بدلاً من ذلك. تحتوي مقابض pthread الضمنية على حالة مؤشر ترابط منفصل، مما يؤدي إلى استدعاء pthread_detach() داخل مؤشر الترابط لإرجاع EINVAL. يبدو أن أهداف V*-static* لم تتأثر. والفرق الأساسي هو أن الأخير يتم إنشاؤه من وحدة تجميع واحدة.
يعمل الآن الارتباط الثابت لملف كائن صغير (MinGW). الكود التلقائي مطلوب ولكن لا يوجد شيء يشير بشكل صريح إلى هذا الكود لذلك تم تحسينه.
يمكن أن يُرجع الدالة sem_getvalue() قيمة errno بدلاً من تعيين errno وإرجاع -1.
تم فقدان قيم Errno إذا كانت المكتبة مرتبطة بشكل ثابت بمكتبة وقت التشغيل، مما يعني أيضًا أن التطبيق يستخدم نسخة منفصلة لوقت التشغيل. لا يزال هذا هو الحال باستثناء أنه تمت إضافة مفتاح إنشاء يسمح بتضمين حالة خطأ أكثر قوة، أي السماح باسترداد رمز الإرجاع عبر GetLastError().
تم تحديد سبب حالات الفشل الكبيرة حول الإلغاء وpthread_exit() لتكوين بناء GCE (GNU C++) على أنه قادم من Mingw32. لست متأكدًا مما إذا كان هذا أمرًا عامًا أم فقط عند إنشاء مكتبات وتطبيقات 32 بت تعمل على أنظمة 64 بت. لا تنشأ هذه الإخفاقات مع إصدارات Mingw64 32 بت (دول مجلس التعاون الخليجي المبنية مع تمكين multilib) التي تعمل على أنظمة 64 بت.
تسبب خطأ pthread_key_delete() الذي تم تقديمه في الإصدار 2.9.x في فشل هذا الروتين بطريقة لم تكتشفها مجموعة الاختبار. تمت إضافة اختبار جديد للتأكد من أن هذا الروتين يعمل بشكل صحيح، خاصة عند حذف المفاتيح ذات أدوات التدمير قبل إنهاء سلاسل العمليات.
يقوم pthread_win32_process_attach_np() بإصلاح الفشل/الأمان المحتمل حول البحث عن ملف QUSEREX.DLL وتحميله.
تم الآن تعيين _POSIX_THREAD_ATTR_STACKADDR على -1 في pthread.h. ونتيجة لذلك، يقوم pthread_attr_setstackaddr() الآن بإرجاع ENOSYS. في السابق، كانت القيمة مخزنة ويمكن استرجاعها ولكنها كانت غير مستخدمة. تقوم pthread_attr_getstackaddr() بإرجاع ENOSYS في المقابل.
تم إصلاح تسرب محتمل للذاكرة في pthread_mutex_init(). لن يحدث التسرب إلا في حالة فشل تهيئة كائن المزامنة (mutex) (وهو أمر نادر للغاية إن وجد).
تم إصلاح المهلات التي تبلغ أقل من مللي ثانية، والتي تسببت في انشغال المكتبة بالانتظار.
إصلاح حالة السباق والتعطل في أقفال MCS. كان رمز إدارة قائمة انتظار النادل في ptw32_mcs_lock_acquire يتنافس مع رمز إدارة قائمة الانتظار في ptw32_mcs_lock_release ويتسبب في حدوث خطأ في التجزئة.
(2012/05/27)
لم يتم تطبيق إصلاحات الأخطاء الجديدة في هذا الإصدار منذ 2.8.0 على سلسلة 1.xx.
يحل هذا الإصدار محل إصدار 2.9.0 المختصر للغاية ويضيف بعض التغييرات غير المتعلقة بالتعليمات البرمجية التي تم إجراؤها في اللحظة الأخيرة لتضمين خصائص وصفية أفضل في ملفات dll للإشارة إلى البنية المستهدفة وبيئات الإنشاء.
قد لا تكون بعض التغييرات التي تمت بعد 26-02-2011 في CVS متوافقة مع أنظمة ما قبل Windows 2000.
لا يُنصح الآن باستخدام أي إصدار آخر غير الإصدار "C" من المكتبة. أي أن الإصدار "C++" يفشل في بعض الاختبارات ولا يوفر أي وظائف إضافية.
تم اختبار هذا الإصدار على بنية SMP (Intel x64 Hex Core) من خلال استكمال مجموعة الاختبار المضمنة واختبارات الضغط والمقعد.
تشتمل خصائص DLL الآن بشكل صحيح على البنية المستهدفة، أي انقر بزر الماوس الأيمن على الملف pthreadVC2.dll في المستكشف واختر علامة التبويب "التفاصيل" التي ستظهر المترجم والهندسة المعمارية في حقل الوصف، على سبيل المثال "MS C x64" أو "MS C x86".
أصبح الاعتماد على مكتبة Winsock الآن تقديريًا عبر #define RETAIN_WSALASTERROR
في config.h. إنه غير محدد افتراضيًا ما لم يتم تعريف WINCE (لأنني (RJ) لست متأكدًا من التبعية هناك).
(إصدارات MSC وGNU) تتم الآن تهيئة المكتبة المرتبطة بشكل ثابت وتنظيفها تلقائيًا عند بدء/خروج البرنامج، أي أن التطبيقات المرتبطة بشكل ثابت لا تحتاج إلى استدعاء الإجراءات pthread_win32_process_attach_np() وpthread_win32_process_detach_np() بشكل صريح. يتم أيضًا استدعاء الإجراء الروتيني لكل مؤشر ترابط pthread_win32_thread_detach_np() عند خروج البرنامج لتنظيف موارد POSIX التي تم الحصول عليها بواسطة مؤشر الترابط الأصلي لنظام التشغيل Windows، إذا فهمت (RJ) العملية بشكل صحيح. قد تحتاج سلاسل رسائل Windows الأصلية الأخرى التي تستدعي إجراءات POSIX API إلى استدعاء روتين فصل مؤشر الترابط عند خروج مؤشر الترابط إذا كان التطبيق يعتمد على موارد POSIX المستصلحة أو تشغيل أدوات تدمير POSIX TSD (TLS). راجع README.NONPORTABLE للحصول على وصف لهذه الإجراءات.
يتم تنفيذ كائنات المزامنة القوية ضمن نطاق PROCESS_PRIVATE. لاحظ أن وظائف pthread_mutex_* قد تُرجع رموز خطأ مختلفة لكائنات المزامنة القوية عما تفعله في الاستخدام العادي، على سبيل المثال، pthread_mutex_unlock مطلوب للتحقق من الملكية لجميع أنواع كائن المزامنة عندما يكون كائن المزامنة قويًا، في حين أن هذا لا يحدث للكائنات غير "العادية" نوع كائن المزامنة القوي.
يتم تطبيق pthread_getunique_np للتوافق على مستوى المصدر مع بعض التطبيقات الأخرى. يقوم هذا الروتين بإرجاع رقم تسلسلي 64 بت مقترن بشكل فريد بمؤشر الترابط. يمكن استخدامه من قبل التطبيقات لطلب أو تجزئة مقابض سلاسل POSIX.
العديد من التغييرات لأنظمة 64 بت.
تعديلات وإصلاحات مختلفة لبناء واختبار WinCE.
إصلاح pthread_cond_destroy() - لا ينبغي أن يكون نقطة إلغاء. تم إصلاح مشاكل البناء البسيطة الأخرى.
قم بإزالة حالة الجمود المحتملة من pthread_cond_destroy().
تعديلات مختلفة لبناء واختبار Win64.
إصلاحات مختلفة لملف مساعد الإلغاء غير المتزامن QueueUserAPCEx DLL (هذا تنزيل منفصل) وعمليات تنظيف كود pthreads.
تمت إزالة مرجع مؤشر NULL المحتمل.
تمت إزالة متطلب قيام التطبيقات بتقييد عدد سلاسل الرسائل التي تستدعي pthread_barrier_wait لعدد الحاجز فقط. تم أيضًا تقليل التنافس بين Barrier_wait وBarrier_destroy. سيؤدي هذا التغيير إلى إبطاء حركة الحواجز قليلاً، ولكنه سيخفض عدد الإشارات المستهلكة لكل حاجز إلى النصف إلى واحد.
تم إصلاح تسرب المقبض في sched_[gs]etscheduler.
تمت إزالة كافة وحدات الماكرو المتوافقة مع وظيفة إعادة الدخول POSIX من pthread.h. بعضها ببساطة لم يكن صحيحًا من الناحية الدلالية.
لم تعد مؤشرات الترابط تحاول تمرير الاستثناءات التي لم يتم اكتشافها خارج نطاق مؤشر الترابط (إصدارات C++ وSEH فقط). تؤدي الاستثناءات التي لم يتم اكتشافها الآن إلى خروج مؤشر الترابط برمز الإرجاع PTHREAD_CANCELED.
الكثير من إصلاحات الصب خاصة لـ x64، والإصلاحات المتشابكة وإعادة العمل لـ x64.
أصبح الاعتماد على مكتبة Winsock الآن تقديريًا عبر #define RETAIN_WSALASTERROR
في config.h. إنه غير محدد افتراضيًا ما لم يتم تعريف WINCE (لأن RJ غير متأكد من التبعية هناك).
تم استبدال العديد من كائنات POSIX الثابتة المستخدمة للإدارة الداخلية بأقفال قائمة انتظار MCS لتقليل استهلاك الموارد، وخاصة استخدام كائنات Win32.
للأمان، يجب الآن تثبيت ملف QuserEx.dll، إذا تم استخدامه، في مجلد نظام Windows.
strong[1-5].c - تسلسل كائنات المزامنة القوية 1.c - أرقام تسلسلية فريدة لكل خيط
تم تعديل جميع اختبارات mutex*.c حيثما كان ذلك مناسبًا لاختبار كائنات المزامنة القوية أيضًا في ظل نفس الظروف. تمت إضافة اختبارات كائن المزامنة القوية إلى benchtest*.c حيثما كان ذلك مناسبًا.
(2006/12/22)
لم يتم تطبيق إصلاحات الأخطاء الجديدة في هذا الإصدار منذ 2.7.0 على سلسلة الإصدار 1.xx. ربما حان الوقت لإسقاط الإصدار 1.
لم يتم اختبار هذا الإصدار بعد على معماريات SMP. تمر جميع الاختبارات على نظام أحادي المعالج.
يمكن لـ Sem_destroy إرجاع EBUSY على الرغم من عدم وجود سلاسل رسائل في انتظار الإشارة. تمت إزالة السباقات الأخرى حول إبطال بنيات الإشارة (داخليًا) أيضًا.
semaphore5.c - يختبر إصلاح الأخطاء المشار إليها أعلاه.
(2005/06/04)
تم نقل جميع الميزات الجديدة في هذا الإصدار إلى الإصدار 1.11.0، بما في ذلك دمج أقفال MCS في pthread_once، ومع ذلك، يظل الإصداران 1 و2 غير متوافقين على الرغم من أنهما متطابقان الآن في الأداء والوظيفة.
تم اختبار هذا الإصدار (اجتاز مجموعة الاختبار) على كل من الأنظمة أحادية المعالج والأنظمة متعددة المعالجات.
تمت إعادة تنفيذ Pthread_once لإزالة تعزيز الأولوية والتعقيدات الأخرى لتحسين المتانة. تمت إزالة سباقات مقابض Win32 التي ليست فريدة من نوعها لإعادة التدوير. الشكل العام لـ pthread_once هو الآن نفس الشكل الذي اقترحه Alexander Terekhov سابقًا، ولكن بدلاً من "mutex المسمى"، تم تنفيذ قفل قائم على قائمة الانتظار والذي يتمتع بالخصائص المطلوبة للتهيئة الذاتية الديناميكية والتدمير. هذا القفل فعال أيضًا. لا يتأثر ABI بقدر ما لم يتغير حجم pthread_once_t ولم يتغير PTHREAD_ONCE_INIT، ومع ذلك، فإن التطبيقات التي تلقي نظرة خاطفة على pthread_once_t، والتي من المفترض أن تكون معتمة، سوف تنقطع.
(2005/05/19)
تمت إعادة جميع إصلاحات الأخطاء والميزات الجديدة في هذا الإصدار إلى الإصدار 1.10.0.
تم اختبار هذا الإصدار (اجتاز مجموعة الاختبار) على كل من الأنظمة أحادية المعالج والأنظمة متعددة المعالجات. شكرًا لـ Tim Theisen في TomoTherapy لإجراء اختبارات MP بشكل شامل ولتوفير الملاحظات والبيانات الحاسمة عند اكتشاف الأخطاء.
(2005/05/09)
تتضمن الحزمة الآن مجموعة وثائق مرجعية تتكون من صفحات يدوية بنمط Unix بتنسيق HTML تم تحريرها لتتوافق مع pthreads-win32. يمكن أيضًا قراءة المجموعة عبر الإنترنت على: http://sources.redhat.com/pthreads-win32/manual/index.html
شكرًا مرة أخرى لـ Tim Theisen لتشغيل الإصدار المسبق لمجموعة الاختبار على نظام MP.
تمت إعادة جميع إصلاحات الأخطاء والميزات الجديدة في هذا الإصدار إلى الإصدار 1.9.0.
يتجنب التنفيذ المعدل الحاجة إلى التعامل مع المشكلات ويستعيد الذاكرة بمجرد حذف المفتاح أو خروج مؤشر الترابط، أيهما أولاً.
شكرًا لريتشارد هيوز في Aculab لتحديد مكان التسرب وتحديد مكانه.
تتم الآن معالجة أدوات تدمير مفاتيح TSD لما يصل إلى PTHREAD_DESTRUCTOR_ITERATIONS مرة بدلاً من مرة واحدة فقط. تم تعريف PTHREAD_DESTRUCTOR_ITERATIONS في pthread.h لبعض الوقت ولكن لم يتم استخدامه.
أصلح السباق المحاسبي للإشارة بين إلغاء sem_post/sem_post_multiple وsem_wait. هذه هي نفس المشكلة مع sem_timedwait التي تم إصلاحها في الإصدار الأخير.
يتحقق الآن sem_init وsem_post وsem_post_multiple من أن عدد الإشارة لا يتجاوز أبدًا _POSIX_SEM_VALUE_MAX.
على الرغم من أن sigwait() ليس أكثر من مجرد أمر محظور، إلا أنه يجب أن يكون على الأقل نقطة إلغاء ليكون متوافقًا مع المعيار.
Stress1.c - يحاول الكشف عن المشاكل في متغير الحالة ومنطق الانتظار المحدد بوقت للإشارة. تم استلهام هذا الاختبار من نموذج اختبار ستيفان مولر المستخدم لتحديد خطأ sem_timedwait من الإصدار الأخير. إنه ليس جزءًا من مجموعة الاختبار العادية لأنه قد يستغرق بعض الوقت للتشغيل. لتشغيله: قم بتنظيف ضغط VC
tsd2.c - اختبارات إعادة تشغيل أدوات تدمير المفاتيح إذا لم تكن قيمة مفتاح tsd فارغة بعد تشغيل روتين أداة التدمير. يتم أيضًا اختبار أن pthread_setspeci() وpthread_getspeci() قابلان للاستدعاء من أدوات التدمير.
(2005/04/26)
لا توجد الآن خطة لإصدار الإصدار 3.0.0 لإصلاح المشكلات في pthread_once(). سيتم التحقيق في التطبيقات المحتملة الأخرى لـ pthread_once لإصدار مستقبلي محتمل في محاولة لتقليل تعقيد التنفيذ الحالي.
تمت إعادة جميع إصلاحات الأخطاء والميزات الجديدة في هذا الإصدار إلى الإصدار 1.8.0.
تم إصلاح سباق pthread_once (الفشل في نظام MP). شكرًا لـ Tim Theisen لإجراء اختبار شامل قبل النشر على نظام MP الخاص به باستخدام مجموعة من المترجمين: VC++ 6 VC++ 7.1 Intel C++ الإصدار 8.0 تم اجتياز جميع الاختبارات. تم أيضًا إجراء بعض التحسينات الطفيفة في السرعة.
إصلاح خطأ تجاوز عدد صحيح في pthread_mutex_timedlock() - غاب عندما تم إصلاح sem_timedwait() في الإصدار 2.2.0. لم يعد هذا الروتين يُرجع ENOTSUP عندما يتم تعريف NEED_SEM - فهو مدعوم (NEED_SEM مطلوب فقط لإصدارات WinCE التي تسبق الإصدار 3.0).
إصلاح خطأ المهلة في sem_timedwait().
قم بإصلاح العديد من المشكلات في الكود المضمن NEED_SEM بشكل مشروط. يتم توفير التعليمات البرمجية المضمنة NEED_SEM للأنظمة التي لا تطبق إشارات W32، مثل WinCE قبل الإصدار 3.0. تم إنشاء تطبيق بديل لإشارات POSIX باستخدام أحداث W32 لهذه الأنظمة عند تحديد NEED_SEM. تمت إعادة كتابة هذا الرمز بالكامل في هذا الإصدار لإعادة استخدام معظم رمز إشارة POSIX الافتراضي، وعلى وجه الخصوص، لتنفيذ كافة إجراءات sem_* التي يدعمها pthreads-win32. يقوم Tim Theisen أيضًا بتشغيل مجموعة الاختبار عبر كود NEED_SEM على نظام MP الخاص به. مرت جميع الاختبارات.
يتم الآن إنشاء المكتبة بدون أخطاء لبرنامج التحويل البرمجي Borland Builder 5.5.
يعد pthread_once معقدًا للغاية - ولكنه يعمل بقدر ما يمكن أن يحدده الاختبار.
فشل إصدار Borland من ملف dll في بعض الاختبارات مع استثناء قراءة الذاكرة. السبب غير معروف حتى الآن ولكن لم يتم استبعاد خطأ المترجم.
(2005/04/12)
الإصدار 1.7.0 عبارة عن مجموعة من الميزات وإصلاحات الأخطاء الجديدة في هذا الإصدار. راجع الملاحظات السابقة ضمن الإصدار 2.0.0/عام.
(2005/04/04)
تمت إضافة أهداف makefile لإنشاء إصدارات الارتباط الثابتة للمكتبة. كل من MinGW وMSVC. يرجى ملاحظة أن هذا لا يعني أي تغيير في ترخيص LGPL، الذي لا يزال يفرض شروطًا محددة على توزيع البرامج التي تم ربطها بشكل ثابت بهذه المكتبة.
يوجد خطأ معروف في pthread_once(). يؤدي إلغاء init_routine إلى الكشف عن مشكلة جوع محتملة (أي طريق مسدود) إذا كان لخيط الانتظار أولوية أعلى من مؤشر الترابط المبدئي. سيتم إصلاح هذه المشكلة في الإصدار 3.0.0 من المكتبة.
إصلاح خطأ تجاوز عدد صحيح في sem_timedwait (). كيفن لوسير
إصلاح توجيهات المعالج المسبق للربط الثابت. ديميتار بانايوتوف
(2005/03/16)
(2005/03/16)
يمثل هذا الإصدار تغييرًا في ABI وتمت زيادة تسمية إصدار DLL من 1 إلى 2، على سبيل المثال pthreadVC2.dll.
الإصدار 1.4.0 يدعم الوظائف الجديدة المضمنة في هذا الإصدار. الرجاء توزيع ملفات DLL المبنية من هذا الإصدار مع تحديثات للتطبيقات المبنية على الإصدار 1.xx من pthreads-win32
تم تغيير تسمية الحزمة، مع استبدال تاريخ اللقطة برقم الإصدار + المعلومات الوصفية. على سبيل المثال، هذا الإصدار هو "pthreads-win32-2-0-0-release".
الإصدار 1.3.0
الإصدار 1.2.0
الإصدار 1.1.0
الإصدار 1.0.0
تعمل هذه اللقطة في المقام الأول على إصلاح علة Condvar التي تم تقديمها في Snapshot-2004-11-03. تم تضمين إصدار DLL أيضًا للسماح للتطبيقات بالتحقق من معلومات إصدار DLL المتوافقة مع Microsoft ، ولتوسيع نظام تسمية DLL لتغييرات واجهة برمجة تطبيقات ABI وتغييرات API الرئيسية (غير متوافقة غير متوافقة). انظر ملف ReadMe للحصول على التفاصيل.
تمت إضافة مورد الإصدار على غرار Microsoft إلى DLL للتطبيقات التي ترغب في التحقق من توافق DLL في وقت التشغيل.
تم تمديد تسمية PTHReads-Win32 DLL للسماح بإصدارات DLL غير المتوافقة بالتعايش في نفس نظام الملفات. راجع ملف ReadMe للحصول على التفاصيل ، ولكن باختصار: بينما ستتغير معلومات الإصدار داخل DLL مع كل إصدار من الآن فصاعدًا ، لن تتغير أسماء إصدار DLL إلا إذا لم يكن DLL الجديد متوافقًا مع التطبيقات القديمة.
تم استعارة مخطط الإصدار من Gnu Libtool ، ومخطط تسمية DLL من Cygwin. شريطة أن يتم تكريم قواعد الترقيم على غرار LIBTOOL ، فإن مخطط تسمية Cygwin DLL يضمن تلقائيًا أن تغييرات اسم DLL ضئيلة وأن التطبيقات لن تقوم بتحميل PTHREADS-Win32 DLL.
سيجد أولئك الذين يستخدمون DLLs المُصمم مسبقًا أن أسماء DLL/LIB لها لاحقة جديدة (1) في هذه اللقطة. مثل pthreadvc1.dll إلخ
لقد تغيرت بعض وحدات الماكرو POSIX.
تهدف هذه التغييرات إلى الامتثال لإصدار مواصفات UNIX الفردي ، والذي ينص على أنه ، إذا تم تعيينه على 0 (صفر) أو غير محدد ، فقد تستخدم التطبيقات SYSCONF () لتحديد قيمها في وقت التشغيل. PTHREADS-Win32 لا ينفذ sysconf ().
لم تعد وحدات الماكرو التالية غير محددة ، ولكنها محددة وتعيينها إلى -1 (لم يتم تنفيذها):
_POSIX_THREAD_ATTR_STACKADDR
_POSIX_THREAD_PRIO_INHERIT
_POSIX_THREAD_PRIO_PROTECT
_POSIX_THREAD_PROCESS_SHARED
يتم تعريف وحدات الماكرو التالية وتعيينها على 200112L (تم تنفيذها):
_POSIX_THREADS
_POSIX_THREAD_SAFE_FUNCTIONS
_POSIX_THREAD_ATTR_STACKSIZE
_POSIX_THREAD_PRIORITY_SCHEDULING
_POSIX_SEMAPHORES
_POSIX_READER_WRITER_LOCKS
_POSIX_SPIN_LOCKS
_POSIX_BARRIERS
يتم تعريف وحدات الماكرو التالية وتعيينها على القيم المناسبة:
_POSIX_THREAD_THREADS_MAX
_POSIX_SEM_VALUE_MAX
_POSIX_SEM_NSEMS_MAX
PTHREAD_DESTRUCTOR_ITERATIONS
PTHREAD_KEYS_MAX
PTHREAD_STACK_MIN
PTHREAD_THREADS_MAX
لا يمكن استخدام DLLs المنتجة من هذه اللقطة مع التطبيقات القديمة دون إعادة تجميع التطبيق ، نظرًا لتغيير إلى PTHREAD_T لتوفير معرفات مؤشر ترابط POSIX فريدة من نوعها.
على الرغم من أن هذه اللقطة تمر بجناح الاختبار الموسع ، إلا أن العديد من التغييرات تامة إلى حد ما ، وقد تظهر بعض التطبيقات سلوكًا مختلفًا عن السابق ، لذلك يتم اعتمادها بعناية. نأمل أن يكون أي سلوك متغير بسبب أن تكون المكتبة أفضل في وظيفتها ، وليس أسوأ.
PTHREAD_CREATE () لم يعد يقبل فارغًا كمرجع مؤشر ترابط. سينتج عن Segfault (خطأ الوصول إلى الذاكرة) ، ولن يتم إنشاء أي مؤشر ترابط.
PTHREAD_BARRIER_WAIT () لم يعد بمثابة نقطة إلغاء.
إصلاح حالة السباق المحتملة في pthread_once ()
تمت إضافة للتوافق: pthread_recursive_mutex_initializer ، pthread_errorcheck_mutex_initializer ، pthread_recursive_mutex_initializer_np ، pthread_errorcheck_mutex_initializer_np
الدعم الأولي لمرجم المريخ الرقمي
أسرع موتيكس. تم إعادة كتابة هذه بعد ذلك بعد نموذج قدمه ألكساندر تيريكوف يقلل من عمليات فحص مساحة kernel ، ويزيل بعض الأقسام الحرجة الإضافية المستخدمة لإدارة السباق بين انتهاء صلاحية التوقيت وإلغاء القفل. يرجى العلم أن Mutexes الجديدة لا تفرض جدولة FIFO المطلقة الصارمة من Mutexes ، ولكن يجب أن يكون أي عملية استحواذ خارج الطلب نادرة جدًا.
أسرع semaphores. باتباع نموذج مشابه لـ Mutexes أعلاه ، تمت إعادة كتابة هذه الأشياء لاستخدام عمليات فحص الفضاء الأولية للمستخدمين.
SEM_GETVALUE () يعيد الآن عدد النوادل.
معرف موضوع POSIX لديه الآن خصائص تفرد أقوى بكثير. مكتبة الجارانتز لا يعيدون استخدام معرف الخيط نفسه لدورات تدمير/إنشاء مؤشر ترابط ما لا يقل عن 2^(الكلمات).
semaphore4.c: اختبارات إلغاء SEM_WAIT () الجديدة.
semaphore4t.c: بالمثل لـ sem_timedwait ().
RWLOCK8.C: اختبارات ومرات مسارات التنفيذ البطيئة لأقفال R/W ، والسيرة CVS ، Mutexes ، و Semaphores التي تم بناؤها.
محاولة إضافة Watcom إلى قائمة المترجمين الذين يمكنهم إنشاء المكتبة. فشل هذا في النهاية بسبب errno غير مدرك. البناء المكتبة ولكن جناح الاختبار فشل. انظر readme.watcom لمزيد من التفاصيل.
ملاحظة: إذا كنت لا تستخدم إلغاء ASYNC في تطبيقك ، أو لا تحتاج إلى إلغاء مؤشرات الترابط المحظورة على موارد النظام مثل الشبكة I/O ، فإن إلغاء التزامن الافتراضي غير المسبق ربما يكون جيدًا بما فيه الكفاية. ومع ذلك ، فإن PTHREADS-Win32 يكتشف تلقائيًا توفر هذه المكونات في وقت التشغيل ، لذلك لا تحتاج إلى إعادة بناء المكتبة من المصدر إذا قمت بتغيير رأيك لاحقًا.
لا تزال جميع النصائح المتوفرة في الكتب وأماكن أخرى حول عدم مرغوبها في استخدام الإلغاء ASYNC في أي تطبيق ، ولكن هذه الميزة هي إضافة مرحب بها فيما يتعلق بمطابقة المكتبة مع معيار POSIX.
تنظيف إدارة أولوية الخيط. على وجه الخصوص ، يحاول إعداد أولوية مؤشر الترابط الآن تعيين قيم Win32 غير صالحة ضمن النطاق الذي تم إرجاعه بواسطة Sched_get_Priority_Min/Max () إلى قيم مفيدة. انظر README.Nonable تحت "Thread Priority".
PTHREAD_GETSCHEDPARAM () يعيد الآن الأولوية المعطاة من قبل أحدث مكالمة إلى PTHREAD_SETSTCHEDPARAM () أو تأسيسها بواسطة PTHREAD_CREATE () ، كما هو مطلوب في المعيار. في السابق ، قام PTHREAD_GETSCHEDPARAM () بإرجاع أولوية مؤشر ترابط التشغيل بشكل غير صحيح في وقت المكالمة ، والتي ربما تم تعديلها أو ترقيتها مؤقتًا.
SCHED_GET_PRIORITY_MIN () و SCHED_GET_PRIORITY_MAX () الآن إرجاع -1 على خطأ وتعيين ERRNO. في السابق ، قاموا بإرجاع قيمة الخطأ بشكل غير صحيح مباشرة.
من شأن pthread_self () تحرير مقبض مؤشر ترابط POSIX الضمني الذي تم إنشاؤه حديثًا إذا فشلت DupLicateHandle بدلاً من إعادة تدويره (من غير المحتمل جدًا).
PTHREAD_EXIT () لم يكن التحرر أو إعادة تدوير بنية مؤشر ترابط POSIX لمروح POSIX الضمنية.
منذ تطبيق John Bossom الأصلي ، سمحت المكتبة بمواضيع تهيئة غير محددة (مؤشرات الترابط Win32) للاتصال بروتينات Pthreads-Win32 وبالتالي التفاعل مع مؤشرات ترابط Posix. يتم ذلك عن طريق إنشاء معرف مؤشر ترابط POSIX على أساس النحيل لخيط Win32 الذي ، بمجرد إنشائه ، يسمح بالتفاعل المتبادل تمامًا. لم يمتد هذا إلى إلغاء الخيط (غير متزامن أو مؤجل). الآن يفعل.
يمكن إلغاء أي مؤشر ترابط بواسطة أي مؤشر ترابط آخر (Win32 أو POSIX) إذا كانت قيمة POSIX PTHREAD_T الخاصة بالخيط السابق. سيتم تشغيل TSD Destructors و Posix Cleanup معالجات قبل أن يخرج الخيط برمز خروج من PTHREAD_CANCELED (تم استرجاعه باستخدام getExitCodethRead ()).
يتيح هذا لخيط Win32 ، على سبيل المثال ، استدعاءات Call Posix CV بالطريقة نفسها التي يجب أن/يجب أن تكون مؤشرات ترابط POSIX/مع معالجات الإلغاء PTHREAD_COND_WAIT () (PTHREAD_COND_WAIT () نقطة إلغاء POSIX).
من خلال إضافة الإلغاء ، يجب أن تكون مؤشرات ترابط Win32 قادرة الآن على استدعاء جميع روتينات مؤشرات ترابط Posix التي تجعل من المنطقي بما في ذلك الإشارات ، ومتغيرات الحالة ، وأقفال القراءة/الكتابة ، والحواجز ، و spinlock ، و TSD ، ودفع/pop cleanup ، والإلغاء ، pthread_exit ، الجدولة ، إلخ .
لاحظ أن معرفات مؤشر ترابط POSIX "الضمنية" هذه يتم فصلها على أنها منفصلة (غير قابلة للانضمام) مع نوع الإلغاء المؤجل. سيتم إنشاء معرف مؤشر ترابط POSIX تلقائيًا بواسطة أي إجراءات POSIX التي تحتاج إلى مقبض POSIX (ما لم يحتاج الروتين إلى PTHREAD_T كمعلمة بالطبع). يمكن لخيط Win32 اكتشاف معرف مؤشر ترابط POSIX الخاص به عن طريق الاتصال بـ PTHREAD_SESH () ، والذي سيقوم بإنشاء المقبض إذا لزم الأمر وإرجاع قيمة PTHREAD_T.
اختبار الميزة الجديدة أعلاه.
تعمل هذه اللقطة على إصلاح بعض الفساد العرضي لمصادر حالة الاختبار الجديدة. لا توجد تغييرات على رمز مصدر المكتبة.
تغييرات مختلفة لتشديد التحقق من ARG ، والعمل مع إصدارات لاحقة من MingW32 و MsySdtk.
PTHREAD_GETSCHEDPARAM () وما إلى ذلك ، التحقق من صحة الخيط الخطرة الثابتة.
يستخدم SEM_TIMEDWAIT () الآن فحوصات أكثر إحكامًا لقيم الامتناع غير المعقولة - وهذا من شأنه أن يؤدي إلى قيم مهلة غير متوقعة.
PTW32_COND_WAIT_CLEANUP () لم يعد يستهلك بشكل غامض إشارات السيرة الذاتية ولكن قد ينتج المزيد من الاستيقاظ الزائفة. يُعتقد أن مكالمة SEM_TIMEDWAIT () تستهلك إشارة CV التي لا ينبغي.
إصلاح تسرب الذاكرة في PTW32_ThreadDestroy () للمواضيع الضمنية.
الإمكانات الثابتة للقتال في pthread_cond_destroy (). يمكن أن يحدث Deadlock للسيرة الذاتية المعلنة بشكل ثابت (PTHREAD_COND_INITIALIZER) ، عندما يحاول مؤشر ترابط واحد تدمير متغير الحالة بينما يحاول الآخر تهيئته ديناميكيًا.
في السابق ، إذا لم يتم تحديده ، تم تحديد نمط التنظيف تلقائيًا من المترجم/اللغة ، وتم تعريف أحد ما يلي وفقًا لذلك:
PTW32_CLEANUP_SEH MSVC only
PTW32_CLEANUP_CXX C++, including MSVC++, GNU G++
PTW32_CLEANUP_C C, including GNU GCC, not MSVC
تحدد هذه المعرفة نمط التنظيف (انظر pthread.h) ، والأهم من ذلك ، الطريقة التي يتم بها تنفيذ الإلغاء وخروج مؤشر الترابط (عبر pthread_exit) (انظر الروتينية ptw32_throw () في private.c).
باختصار ، ترمي إصدارات الاستثناءات من المكتبة استثناءًا عند إلغاء مؤشر ترابط أو يخرج (عبر pthread_exit ()) ، والذي يتم صيده بواسطة معالج في روتين بدء التشغيل ، بحيث يحدث رفقة المكدس الصحيح بغض النظر عن المكان الموضوع هو عندما يتم إلغاؤه أو يخرج عبر pthread_exit ().
في هذه اللقطات والمستقبلية ، ما لم يحدد البناء صراحة (على سبيل المثال عبر خيار مترجم) PTW32_CLEANUP_SEH ، PTW32_CLEANUP_CXX ، أو PTW32_CLEANUP_C ، فإن البناء يتنظيف الآن دائمًا إلى PTW32_CLEANUP_C النمط. يستخدم هذا النمط setjmp/longjmp في تطبيقات الإلغاء و pThRead_exit ، وبالتالي لن يقوم بالفصل المكدس حتى عند ربطه بالتطبيقات التي تحتوي عليها (مثل تطبيقات C ++). هذا من أجل الاتساق مع معظم تطبيقات خيوط UNIX POSIX التجارية الحالية. قد يكون TRU64 من Compaq استثناء (لا يقصد التورية) والاتجاه المستقبلي المحتمل.
على الرغم من أنه لم يتم توثيقه بوضوح من قبل ، إلا أنه لا يزال من الضروري إنشاء التطبيق الخاص بك باستخدام نفس PTW32_Cleanup_* تعريف كما تم استخدامه لإصدار المكتبة التي ترتبط بها ، بحيث يتم تضمين الأجزاء الصحيحة من pthread.h. أي أن التعريفات المحتملة تتطلب إصدارات المكتبة التالية:
PTW32_CLEANUP_SEH pthreadVSE.dll
PTW32_CLEANUP_CXX pthreadVCE.dll or pthreadGCE.dll
PTW32_CLEANUP_C pthreadVC.dll or pthreadGC.dll
على سبيل المثال ، بغض النظر عما إذا كان تطبيقك هو C أو C ++ ، إذا قمت بالربط بـ pthreadvc.lib أو libpthreadgc.a ، فيجب عليك تحديد ptw32_cleanup_c.
الهدف من كل هذا هو: إذا لم تكن قد حددت واحدة من هذه بشكل صريح ، فسيتم استخدام الإعدادات الافتراضية كما هو موضح في الجزء العلوي من هذا القسم.
يتغير هذا الآن ، كما هو موضح أعلاه ، ولكن في محاولة لجعل هذا أكثر وضوحًا ، إليك مثال:
إذا كنت تقوم ببناء التطبيق الخاص بك باستخدام MSVC ++ IE باستخدام استثناءات C ++ ولم يتم تحديد واحدة من PTW32_CLEANUP_*، ثم تم تعريف PTW32_CLEANUP_C ++ تلقائيًا لك في PTHREAD.H. يجب أن تكون قد تربط بـ pthreadvce.dll ، والتي لا تكدس الاسترخاء.
إذا قمت الآن بإنشاء تطبيقك كما كان من قبل ، فسيقوم Pthread.h الآن بتعيين PTW32_Cleanup_C كأناقة افتراضية ، وستحتاج إلى الارتباط مع PThReadVc.Dll. لن يحدث الآن فرض المكدس عند إلغاء مؤشر ترابط ، أو يقوم مؤشر الترابط باستدعاء PTHREAD_EXIT ().
من المرجح أن يتصرف طلبك الآن بشكل مختلف للإصدارات السابقة ، وبطرق غير واضحة. على الأرجح أنه قد لا يتم تدمير أو تنظيف الكائنات التي تم إنشاء مثيل لها محليًا.
إذا كنت تريد نفس السلوك كما كان من قبل ، فيجب عليك الآن تحديد ptw32_cleanup_c ++ بشكل صريح باستخدام خيار برنامج التحويل البرمجي والارتباط مع pthreadvce.dll كما فعلت من قبل.
لماذا نجعل النمط الافتراضي أقل استثناء؟ نظرًا لعدم وجود تطبيق Threads الخاص بـ UNIX POSIX يتيح لك اختيار الاسترخاء المكدس. لذلك ، فإن توفيره في pthread-win32 باعتباره افتراضيًا أمر خطير. ما زلنا نقدم الخيار ولكن ما لم تختار بوعي القيام بخلاف ذلك ، فسيتم تشغيل تطبيقات PTHReads الخاصة بك الآن بطرق مماثلة بغض النظر عن منصة المواضيع التي تستخدمها. أو على الأقل هذا هو الأمل.
لماذا لا تزيل إصدارات الاستثناءات من المكتبة تمامًا؟ هناك بعض الأسباب:
من أجل تمكين أحجام الصور الأصغر التي يجب إنشاءها للتطبيقات التي ترتبط بشكل ثابت مع المكتبة ، تم فصل معظم الروتين إلى ملفات شفرة المصدر الفردية.
يتم ذلك بطريقة متوافقة مع الخلف. تتم إعادة استخدام ملفات المصدر القديمة لتجميع الملفات الروتينية الفردية في وحدات ترجمة أكبر (عبر مجموعة من #includes) بحيث لا يزال بإمكان المترجم التحسين كلما كان ذلك ممكنًا ، على سبيل المثال ، من خلال الإطار ، والذي لا يمكن القيام به إلا داخل وحدة الترجمة نفسها.
من الممكن أيضًا إنشاء المكتبة بأكملها عن طريق تجميع الملف الفردي المسمى "pthread.c" ، والذي يوفر فقط جميع ملفات مصدر الجماعة الثانوية. قد يتمكن المترجم
على الرغم من أن برنامج التحويل البرمجي GNU قادر على إنتاج المكتبات ذات الفصل الضروري (مفتاح القطاعات الوظيفية) ، فإن AFAIK و MSVC وغيرها من المجمعين لا يملكون هذه الميزة.
أخيرًا ، نظرًا لأنني أستخدم Makefiles وتجميع سطر الأوامر ، لا أعرف ما هو الخراب الذي قد يعيده إعادة التنظيم بين مستخدمي ملف مشروع IDE. يجب أن تكون قادرًا على متابعة استخدام ملفات المشروع الحالية دون تعديل.
pthread_num_procsors_np ():
إرجاع عدد المعالجات في النظام المتاحة للعملية ، على النحو المحدد من قناع تقارب المعالج.
pthread_timechange_handler_np ():
لتحسين التسامح ضد المشغل أو خدمة الوقت التي بدأت في ساعة النظام.
يمكن استدعاء هذا الروتين بواسطة تطبيق عندما يتلقى رسالة WM_TimeChange من النظام. في الوقت الحالي ، تبث جميع متغيرات الحالة بحيث يمكن لخيوط الانتظار الاستيقاظ وإعادة تقييم ظروفها وإعادة تشغيل الانتظار الموقوتة إذا لزم الأمر.
نظرًا لأن WIN95 لا يوفر واحدة ، فإن المكتبة تحتوي الآن على روتينها الخاص interlockedCompareexChange () ، والذي يتم استخدامه كلما لم يوفرها Windows. يتم استخدام interlockedcompareexchange () لتنفيذ spinlocks والحواجز ، وكذلك في mutexes. يعتمد هذا الروتين على تعليمات جهاز CMPXCHG والتي لا تتوفر على وحدة المعالجة المركزية I386. وبالتالي ، لم تعد هذه المكتبة (من Snapshot 20010712 وما بعدها) مدعومة على منصات معالج I386.
بالنسبة لقابلية رمز المصدر فقط - لا يمكن مشاركة RWLocks بعد.
pthread_rwlockattr_init()
pthread_rwlockattr_destroy()
pthread_rwlockattr_setpshared()
pthread_rwlockattr_getpshared()
على النحو المحدد في معيار POSIX الجديد ، و Oneix Spec Version 3:
sem_timedwait()
pthread_mutex_timedlock() - Alexander Terekhov and Thomas Pfaff
pthread_rwlock_timedrdlock() - adapted from pthread_rwlock_rdlock()
pthread_rwlock_timedwrlock() - adapted from pthread_rwlock_wrlock()
[ليس بعد لـ G ++]
وقد تم ذلك لمنع النزاعات.
يتم تعريف المقبض ، dword ، و null مؤقتًا داخل pthread.h إذا لم تكن بالفعل.
ليس فقط لتجنب الحاجة إلى ملف pthread.def ، ولكن لتحسين الأداء. على ما يبدو ، فإن إعلان الوظائف مع Dllimport يولد مكالمة مباشرة إلى الوظيفة وتجنب النفقات العامة لمكالمة وظيفة كعب.
يمكن أن يكون هذا شفافًا للتطبيقات عن طريق استبدال وحدات الماكرو التي تحدد إصدارات C ++ و SEH الحالية من PTHREAD_CLEANUP_PUSH/POP مع الإصدار C ، لكن معالجات تنظيف AFAIK لن يتم تشغيلها في التسلسل الصحيح مع المدمرين وتنظيف المعالجات عند حدوث استثناء .
لا يمكن الآن إلغاء الإلغاء في سلسلة رسائل مضاعفة عن غير المقصود. أي أنه بمجرد بدء تشغيل سلسلة الرسائل ، يتم تعطيل الإلغاء وسيقوم طلب إلغاء لاحق بإرجاع خطأ (ESRCH).
Errno: تسبب توجيه التحويل البرمجي غير الصحيح في استخدام إصدار محلي من Errno بدلاً من Win32 Errno. كلتا الحالتين آمنتان لخيط الخيط ولكن التطبيقات التي تتحقق من Errno بعد مكالمة Pthreads-Win32 سيكون خاطئًا. إصلاح هذا أيضًا إصلاح خيار برنامج التحويل البرمجي السيئ في testsuite ( /mT يجب أن يكون /md) وهو أمر ضروري للربط مع المكتبة الصحيحة msvcrt.lib.
لإضافتها
لإضافتها
جديد:
Renamed DLL and LIB files:
pthreadVSE.dll (MS VC++/Structured EH)
pthreadVSE.lib
pthreadVCE.dll (MS VC++/C++ EH)
pthreadVCE.lib
pthreadGCE.dll (GNU G++/C++ EH)
libpthreadw32.a
Both your application and the pthread dll should use the
same exception handling scheme.
تم إصلاح الأخطاء:
MSVC++ C++ exception handling.
تمت إضافة بعض الاختبارات الجديدة.
جديد:
asynchronous cancellation on X86 (Jason Nye)
Makefile compatible with MS nmake to replace
buildlib.bat
GNUmakefile for Mingw32
tests/Makefile for MS nmake replaces runall.bat
tests/GNUmakefile for Mingw32
تم إصلاح الأخطاء:
kernel32 load/free problem
attempt to hide internel exceptions from application
exception handlers (__try/__except and try/catch blocks)
Win32 thread handle leakage bug
(David Baggett/Paul Redondo/Eyal Lebedinsky)
تمت إضافة بعض الاختبارات الجديدة.
تم إصلاح الأخطاء:
ctime_r macro had an incorrect argument (Erik Hensema),
threads were not being created
PTHREAD_CANCEL_DEFERRED. This should have
had little effect as deferred is the only
supported type. (Ross Johnson).
تمت إضافة بعض التحسينات التوافق ، على سبيل المثال.
pthread_setcancelstate accepts NULL pointer
for the previous value argument. Ditto for
pthread_setcanceltype. This is compatible
with Solaris but should not affect
standard applications (Erik Hensema)
تمت إضافة بعض الاختبارات الجديدة.
إصلاح الأخطاء - إلغاء المواضيع في انتظار متغيرات الحالة يعمل الآن بشكل صحيح (لورين هوششتاين وبيتر سلاسيك)
تنظيف مكدس الاستثناء الثابت إذا استدعاء pthread_exit ()
الأخطاء الثابتة في متغيرات الحالة - (Peter Slacik): - اختبارات خلاف إضافية - اضبط عدد مؤشرات ترابط الانتظار بشكل صحيح بعد مهلة Condvar المحددة.
تم إصلاح بعض الأخطاء البسيطة. انظر ملف Changelog للحصول على التفاصيل.
يتم الآن تضمين بعض وظائف POSIX 1B ولكن ony إرجاع خطأ (eNOSYS) إذا تم استدعاؤه. هم:
sem_open
sem_close
sem_unlink
sem_getvalue
بعض وظائف POSIX 1B التي تم دعمها داخليًا متاحة الآن كوظائف مصدرة:
sem_init
sem_destroy
sem_wait
sem_trywait
sem_post
sched_yield
sched_get_priority_min
sched_get_priority_max
تم إصلاح بعض الأخطاء البسيطة. انظر ملف Changelog للحصول على التفاصيل.
الإصدار الأولي.