pthread_mutexattr_setrobust(3)

الاسم
pthread_mutexattr_getrobust, pthread_mutexattr_setrobust - الحصول على وضبط سمة المتانة لكائن سمات القفل المتبادل

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

موجز
#include <pthread.h>

int pthread_mutexattr_getrobust(const pthread_mutexattr_t *attr,
                                int *robustness);
int pthread_mutexattr_setrobust(pthread_mutexattr_t *attr,
                                int robustness);

    متطلبات ماكروات اختبار الميزات لـ glibc (انظر feature_test_macros(7)):

pthread_mutexattr_getrobust()، pthread_mutexattr_setrobust():
    _POSIX_C_SOURCE >= 200809L

الوصف
تضع الدالة pthread_mutexattr_getrobust() قيمة سمة المتانة لكائن سمات القفل المتبادل المشار إليه بـ attr في *robustness. وتضبط الدالة pthread_mutexattr_setrobust() قيمة سمة المتانة لكائن سمات القفل المتبادل المشار إليه بـ attr إلى القيمة المحددة في *robustness.

تحدد سمة المتانة سلوك القفل المتبادل عندما يموت الخيط المالك دون فتح القفل المتبادل. القيم التالية صالحة لـ robustness:

PTHREAD_MUTEX_STALLED
    هذه هي القيمة المبدئية لكائن سمات القفل المتبادل. إذا وُصِل قفل متبادل بسمة PTHREAD_MUTEX_STALLED ومات مالكه دون فتحه، يظل القفل المتبادل مقفلاً بعد ذلك وستحجب أي محاولات مستقبلية لاستدعاء pthread_mutex_lock(3) على القفل المتبادل إلى أجل غير مسمى.

PTHREAD_MUTEX_ROBUST
    إذا وُصِل قفل متبادل بسمة PTHREAD_MUTEX_ROBUST ومات مالكه دون فتحه، ستنجح أي محاولات مستقبلية لاستدعاء pthread_mutex_lock(3) على هذا القفل المتبادل وستعيد EOWNERDEAD للإشارة إلى أن المالك الأصلي لم يعد موجودًا وأن القفل المتبادل في حالة غير متناسقة. عادةً بعد إعادة EOWNERDEAD، يجب على المالك التالي استدعاء pthread_mutex_consistent(3) على القفل المتبادل المكتسب لجعله متناسقًا مرة أخرى قبل استخدامه أكثر.

    إذا فتح المالك التالي القفل المتبادل باستخدام pthread_mutex_unlock(3) قبل جعله متناسقًا، سيصبح القفل المتبادل غير قابل للاستخدام بشكل دائم وستفشل أي محاولات لاحقة لقفله باستخدام pthread_mutex_lock(3) مع الخطأ ENOTRECOVERABLE. العملية الوحيدة المسموح بها على مثل هذا القفل المتبادل هي pthread_mutex_destroy(3).

    إذا أنهى المالك التالي قبل استدعاء pthread_mutex_consistent(3)، ستظل عمليات pthread_mutex_lock(3) الإضافية على هذا القفل المتبادل تعيد EOWNERDEAD.

لاحظ أن معامل attr لـ pthread_mutexattr_getrobust() و pthread_mutexattr_setrobust() يجب أن يشير إلى كائن سمات قفل متبادل تمت تهيئته بواسطة pthread_mutexattr_init(3)، وإلا كان السلوك غير محدد.

قيمة الإرجاع
تُعيد هذه الدوال 0 عند النجاح. وتُعيد رقم خطأ موجب عند حدوث خطأ.

في تطبيق glibc، تعيد pthread_mutexattr_getrobust() دائمًا صفرًا.

الأخطاء

EINVAL
    وُصِلت قيمة غير PTHREAD_MUTEX_STALLED أو PTHREAD_MUTEX_ROBUST إلى pthread_mutexattr_setrobust().

الإصدارات
في تطبيق Linux، عند استخدام أقفال متبادلة متينة مشتركة بين العمليات، يتلقى الخيط المنتظر أيضًا إشعار EOWNERDEAD إذا قام مالك قفل متبادل متين بتنفيذ execve(2) دون فتح القفل المتبادل أولاً. لا يحدد POSIX.1 هذه التفاصيل، ولكن يحدث نفس السلوك أيضًا في بعض التطبيقات الأخرى على الأقل.

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

التاريخ
glibc 2.12. POSIX.1-2008.

قبل إضافة pthread_mutexattr_getrobust() و pthread_mutexattr_setrobust() إلى POSIX، عرّفت glibc الدوال غير القياسية المكافئة التالية إذا عُرفت _GNU_SOURCE:

[[deprecated]]
int pthread_mutexattr_getrobust_np(const pthread_mutexattr_t *attr,
                                   int *robustness);
[[deprecated]]
int pthread_mutexattr_setrobust_np(const pthread_mutexattr_t *attr,
                                   int robustness);

بالمقابل، عُرفت أيضًا الثوابت PTHREAD_MUTEX_STALLED_NP و PTHREAD_MUTEX_ROBUST_NP.

واجهات برمجة التطبيقات الخاصة بـ GNU هذه، التي ظهرت لأول مرة في glibc 2.4، أصبحت الآن مهملة ولا ينبغي استخدامها في البرامج الجديدة؛ منذ glibc 2.34، وُسِمت واجهات برمجة التطبيقات هذه بأنها مهملة.

أمثلة
البرنامج أدناه يوضح استخدام سمة المتانة لكائن سمات المزامنة. في هذا البرنامج، يموت خيط يحمل المزامنة مبكراً دون فتح المزامنة. يحصل الخيط الرئيسي لاحقاً على المزامنة بنجاح ويحصل على الخطأ EOWNERDEAD، وبعد ذلك يجعل المزامنة متسقة.

جلسة الصدفة التالية تظهر ما نراه عند تشغيل هذا البرنامج:

    $ ./a.out;
    [original owner] Setting lock...
    [original owner] Locked.  Now exiting without unlocking.
    [main] Attempting to lock the robust mutex.
    [main] pthread_mutex_lock() returned EOWNERDEAD
    [main] Now make the mutex consistent
    [main] Mutex is now consistent; unlocking

  مصدر البرنامج
    #include <err.h>
    #include <errno.h>
    #include <pthread.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>

    static pthread_mutex_t mtx;

    static void *
    original_owner_thread(void *ptr)
    {
        printf("[original owner] Setting lock...\n");
        pthread_mutex_lock(&mtx);
        printf("[original owner] Locked.  Now exiting without unlocking.\n");
        pthread_exit(NULL);
    }

    int
    main(void)
    {
        pthread_t thr;
        pthread_mutexattr_t attr;
        int s;

        pthread_mutexattr_init(&attr);

        pthread_mutexattr_setrobust(&attr, PTHREAD_MUTEX_ROBUST);

        pthread_mutex_init(&mtx, &attr);

        pthread_create(&thr, NULL, original_owner_thread, NULL);

        sleep(2);

        /* "original_owner_thread" should have exited by now.  */

        printf("[main] Attempting to lock the robust mutex.\n");
        s = pthread_mutex_lock(&mtx);
        if (s == EOWNERDEAD) {
            printf("[main] pthread_mutex_lock() returned EOWNERDEAD\n");
            printf("[main] Now make the mutex consistent\n");
            s = pthread_mutex_consistent(&mtx);
            if (s != 0)
                errc(EXIT_FAILURE, s, "pthread_mutex_consistent");
            printf("[main] Mutex is now consistent; unlocking\n");
            s = pthread_mutex_unlock(&mtx);
            if (s != 0)
                errc(EXIT_FAILURE, s, "pthread_mutex_unlock");

            exit(EXIT_SUCCESS);
        } else if (s == 0) {
            printf("[main] pthread_mutex_lock() unexpectedly succeeded\n");
            exit(EXIT_FAILURE);
        } else {
            printf("[main] pthread_mutex_lock() unexpectedly failed\n");
            errc(EXIT_FAILURE, s, "pthread_mutex_lock");
        }
    }

انظر أيضًا
get_robust_list(2), set_robust_list(2), pthread_mutex_consistent(3), pthread_mutex_init(3), pthread_mutex_lock(3), pthreads(7)

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

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

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