pthread_setcancelstate(3)

الاسم
pthread_setcancelstate, pthread_setcanceltype - ضبط حالة ونوع قابلية الإلغاء

المكتبة
مكتبة مسالك POSIX (libpthread، -lpthread)

موجز
#include <pthread.h>

int pthread_setcancelstate(int state, int *oldstate);
int pthread_setcanceltype(int type, int *oldtype);

الوصف
تضبط الدالة pthread_setcancelstate() حالة قابلية الإلغاء للخيط المستدعي إلى القيمة المُعطاة في state. تُعاد حالة قابلية الإلغاء السابقة للخيط في المخزن المؤقت المُشار إليه بـ oldstate. يجب أن تحتوي وسيطة state على إحدى القيم التالية:

PTHREAD_CANCEL_ENABLE
    الخيط قابل للإلغاء. هذه هي حالة قابلية الإلغاء المبدئية في جميع الخيوط الجديدة، بما في ذلك الخيط الرئيس. يحدد نوع قابلية إلغاء الخيط متى سيستجيب خيط قابل للإلغاء لطلب إلغاء.

PTHREAD_CANCEL_DISABLE
    الخيط غير قابل للإلغاء. إذا وُرد طلب إلغاء، يُحجب حتى تُفعّل قابلية الإلغاء.

تضبط الدالة pthread_setcanceltype() نوع قابلية الإلغاء للخيط المستدعي إلى القيمة المُعطاة في type. يُعاد نوع قابلية الإلغاء السابق للخيط في المخزن المؤقت المُشار إليه بـ oldtype. يجب أن تحتوي وسيطة type على إحدى القيم التالية:

PTHREAD_CANCEL_DEFERRED
    يُؤجّل طلب الإلغاء حتى يستدعي الخيط بعد ذلك دالة تمثل نقطة إلغاء (انظر pthreads(7)). هذا هو نوع قابلية الإلغاء المبدئي في جميع الخيوط الجديدة، بما في ذلك الخيط الرئيس.

    حتى مع الإلغاء المؤجل، قد يُعمل بنقطة إلغاء في معالج إشارة غير متزامن ويكون التأثير كما لو كان إلغاءً غير متزامن.

PTHREAD_CANCEL_ASYNCHRONOUS
    يمكن إلغاء الخيط في أي وقت. (عادةً، يُلغى فور استلام طلب إلغاء، لكن النظام لا يضمن ذلك.)

عملية الضبط والاسترداد التي تُنفذها كل من هذه الدوال ذرية بالنسبة للخيوط الأخرى في العملية التي تستدعي نفس الدالة.

قيمة الإرجاع
عند النجاح، تُعيد هذه الدوال القيمة 0؛ وعند الخطأ، تُعيد رقم خطأ غير صفري.

الأخطاء
قد تفشل الدالة pthread_setcancelstate() مع الخطأ التالي:

EINVAL
    قيمة غير صالحة لـ state.

قد تفشل الدالة pthread_setcanceltype() مع الخطأ التالي:

EINVAL
    قيمة غير صالحة لـ type.

السمات
للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر attributes(7).
الواجهة | السمة | القيمة
pthread_setcancelstate(), pthread_setcanceltype() | سلامة الخيوط | MT-Safe
pthread_setcancelstate(), pthread_setcanceltype() | أمان الإلغاء غير المتزامن | AC-Safe

المعايير
POSIX.1-2008.

التاريخ
glibc 2.0 POSIX.1-2001.

ملاحظات
للحصول على تفاصيل ما يحدث عند إلغاء خيط، انظر pthread_cancel(3).

تعطيل قابلية الإلغاء لفترة وجيزة مفيد إذا كان الخيط ينفذ إجراءً حرجًا لا يجب مقاطعته بطلب إلغاء. احذر من تعطيل قابلية الإلغاء لفترات طويلة، أو حول عمليات قد تمنع لفترات طويلة، لأن ذلك سيجعل الخيط غير مستجيب لطلبات الإلغاء.

  قابلية الإلغاء غير المتزامنة
ضبط نوع قابلية الإلغاء إلى PTHREAD_CANCEL_ASYNCHRONOUS نادرًا ما يكون مفيدًا. نظرًا لأنه يمكن إلغاء الخيط في أي وقت، فلا يمكنه حجز الموارد بأمان (مثل تخصيص الذاكرة باستخدام malloc(3))، أو الحصول على كائنات المزامنة، أو الإشارات، أو الأقفال، وما إلى ذلك. حجز الموارد غير آمن لأن التطبيق ليس لديه طريقة لمعرفة حالة هذه الموارد عند إلغاء الخيط؛ أي هل حدث الإلغاء قبل حجز الموارد، أو أثناء حجزها، أو بعد تحريرها؟ علاوة على ذلك، قد تُترك بعض هياكل البيانات الداخلية (مثل القائمة المرتبطة للكتل الحرة التي تديرها عائلة دوال malloc(3)) في حالة غير متناسقة إذا حدث الإلغاء في منتصف استدعاء الدالة. وبالتالي، تتوقف معالجات التنظيف عن كونها مفيدة.

الدوال التي يمكن إلغاؤها بأمان بشكل غير متزامن تُسمى دوال آمنة للإلغاء غير المتزامن. يتطلب POSIX.1-2001 و POSIX.1-2008 فقط أن تكون pthread_cancel(3) و pthread_setcancelstate() و pthread_setcanceltype() آمنة للإلغاء غير المتزامن. بشكل عام، لا يمكن استدعاء دوال المكتبة الأخرى بأمان من خيط قابل للإلغاء غير المتزامن.

أحد الظروف القليلة التي تكون فيها قابلية الإلغاء غير المتزامنة مفيدة هو إلغاء خيط موجود في حلقة حسابية بحتة.

  ملاحظات حول قابلية النقل
تسمح تطبيقات الخيوط في Linux بأن تكون وسيطة oldstate للدالة pthread_setcancelstate() NULL، وفي هذه الحالة لا تُعاد معلومات عن حالة قابلية الإلغاء السابقة إلى المستدعي. تسمح العديد من التطبيقات الأخرى أيضًا بوسيطة oldstat بقيمة NULL، لكن POSIX.1 لا يحدد هذه النقطة، لذا يجب على التطبيقات المحمولة دائمًا تحديد قيمة غير NULL في oldstate. تنطبق مجموعة مماثلة تمامًا من العبارات على وسيطة oldtype للدالة pthread_setcanceltype().

أمثلة
انظر pthread_cancel(3).

انظر أيضًا
pthread_cancel(3)، pthread_cleanup_push(3)، pthread_testcancel(3)، pthreads(7)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.