.\" -*- coding: UTF-8 -*- .\" Copyright 2017, Yubin Ruan .\" Copyright 2017, Michael Kerrisk .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH pthread_mutexattr_setrobust 3 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم pthread_mutexattr_getrobust, pthread_mutexattr_setrobust \- الحصول على وضبط سمة المتانة لكائن سمات القفل المتبادل .SH المكتبة مكتبة مسالك POSIX (\fIlibpthread\fP،\ \fI\-lpthread\fP) .SH موجز .nf \fB#include \fP .P \fBint pthread_mutexattr_getrobust(const pthread_mutexattr_t *\fP\fIattr\fP\fB,\fP \fB int *\fP\fIrobustness\fP\fB);\fP \fBint pthread_mutexattr_setrobust(pthread_mutexattr_t *\fP\fIattr\fP\fB,\fP \fB int \fP\fIrobustness\fP\fB);\fP .fi .P .RS -4 متطلبات ماكروات اختبار الميزات لـ glibc (انظر \fBfeature_test_macros\fP(7)): .RE .P \fBpthread_mutexattr_getrobust\fP()، \fBpthread_mutexattr_setrobust\fP(): .nf .\" FIXME . .\" But see https://sourceware.org/bugzilla/show_bug.cgi?id=22125 _POSIX_C_SOURCE >= 200809L .fi .SH الوصف تضع الدالة \fBpthread_mutexattr_getrobust\fP() قيمة سمة المتانة لكائن سمات القفل المتبادل المشار إليه بـ \fIattr\fP في \fI*robustness\fP. وتضبط الدالة \fBpthread_mutexattr_setrobust\fP() قيمة سمة المتانة لكائن سمات القفل المتبادل المشار إليه بـ \fIattr\fP إلى القيمة المحددة في \fI*robustness\fP. .P تحدد سمة المتانة سلوك القفل المتبادل عندما يموت الخيط المالك دون فتح القفل المتبادل. القيم التالية صالحة لـ \fIrobustness\fP: .TP \fBPTHREAD_MUTEX_STALLED\fP هذه هي القيمة المبدئية لكائن سمات القفل المتبادل. إذا وُصِل قفل متبادل بسمة \fBPTHREAD_MUTEX_STALLED\fP ومات مالكه دون فتحه، يظل القفل المتبادل مقفلاً بعد ذلك وستحجب أي محاولات مستقبلية لاستدعاء \fBpthread_mutex_lock\fP(3) على القفل المتبادل إلى أجل غير مسمى. .TP \fBPTHREAD_MUTEX_ROBUST\fP إذا وُصِل قفل متبادل بسمة \fBPTHREAD_MUTEX_ROBUST\fP ومات مالكه دون فتحه، ستنجح أي محاولات مستقبلية لاستدعاء \fBpthread_mutex_lock\fP(3) على هذا القفل المتبادل وستعيد \fBEOWNERDEAD\fP للإشارة إلى أن المالك الأصلي لم يعد موجودًا وأن القفل المتبادل في حالة غير متناسقة. عادةً بعد إعادة \fBEOWNERDEAD\fP، يجب على المالك التالي استدعاء \fBpthread_mutex_consistent\fP(3) على القفل المتبادل المكتسب لجعله متناسقًا مرة أخرى قبل استخدامه أكثر. .IP إذا فتح المالك التالي القفل المتبادل باستخدام \fBpthread_mutex_unlock\fP(3) قبل جعله متناسقًا، سيصبح القفل المتبادل غير قابل للاستخدام بشكل دائم وستفشل أي محاولات لاحقة لقفله باستخدام \fBpthread_mutex_lock\fP(3) مع الخطأ \fBENOTRECOVERABLE\fP. العملية الوحيدة المسموح بها على مثل هذا القفل المتبادل هي \fBpthread_mutex_destroy\fP(3). .IP إذا أنهى المالك التالي قبل استدعاء \fBpthread_mutex_consistent\fP(3)، ستظل عمليات \fBpthread_mutex_lock\fP(3) الإضافية على هذا القفل المتبادل تعيد \fBEOWNERDEAD\fP. .P لاحظ أن معامل \fIattr\fP لـ \fBpthread_mutexattr_getrobust\fP() و \fBpthread_mutexattr_setrobust\fP() يجب أن يشير إلى كائن سمات قفل متبادل تمت تهيئته بواسطة \fBpthread_mutexattr_init\fP(3)، وإلا كان السلوك غير محدد. .SH "قيمة الإرجاع" تُعيد هذه الدوال 0 عند النجاح. وتُعيد رقم خطأ موجب عند حدوث خطأ. .P في تطبيق glibc، تعيد \fBpthread_mutexattr_getrobust\fP() دائمًا صفرًا. .SH الأخطاء .TP \fBEINVAL\fP وُصِلت قيمة غير \fBPTHREAD_MUTEX_STALLED\fP أو \fBPTHREAD_MUTEX_ROBUST\fP إلى \fBpthread_mutexattr_setrobust\fP(). .SH الإصدارات .\" E.g., Solaris, according to its manual page في تطبيق Linux، عند استخدام أقفال متبادلة متينة مشتركة بين العمليات، يتلقى الخيط المنتظر أيضًا إشعار \fBEOWNERDEAD\fP إذا قام مالك قفل متبادل متين بتنفيذ \fBexecve\fP(2) دون فتح القفل المتبادل أولاً. لا يحدد POSIX.1 هذه التفاصيل، ولكن يحدث نفس السلوك أيضًا في بعض التطبيقات الأخرى على الأقل. .SH المعايير POSIX.1\-2008. .SH التاريخ glibc 2.12. POSIX.1\-2008. .P قبل إضافة \fBpthread_mutexattr_getrobust\fP() و \fBpthread_mutexattr_setrobust\fP() إلى POSIX، عرّفت glibc الدوال غير القياسية المكافئة التالية إذا عُرفت \fB_GNU_SOURCE\fP: .P .nf \fB[[deprecated]]\fP \fBint pthread_mutexattr_getrobust_np(const pthread_mutexattr_t *\fP\fIattr\fP\fB,\fP \fB int *\fP\fIrobustness\fP\fB);\fP \fB[[deprecated]]\fP \fBint pthread_mutexattr_setrobust_np(const pthread_mutexattr_t *\fP\fIattr\fP\fB,\fP \fB int \fP\fIrobustness\fP\fB);\fP .fi .P بالمقابل، عُرفت أيضًا الثوابت \fBPTHREAD_MUTEX_STALLED_NP\fP و \fBPTHREAD_MUTEX_ROBUST_NP\fP. .P واجهات برمجة التطبيقات الخاصة بـ GNU هذه، التي ظهرت لأول مرة في glibc 2.4، أصبحت الآن مهملة ولا ينبغي استخدامها في البرامج الجديدة؛ منذ glibc 2.34، وُسِمت واجهات برمجة التطبيقات هذه بأنها مهملة. .SH أمثلة البرنامج أدناه يوضح استخدام سمة المتانة لكائن سمات المزامنة. في هذا البرنامج، يموت خيط يحمل المزامنة مبكراً دون فتح المزامنة. يحصل الخيط الرئيسي لاحقاً على المزامنة بنجاح ويحصل على الخطأ \fBEOWNERDEAD\fP، وبعد ذلك يجعل المزامنة متسقة. .P جلسة الصدفة التالية تظهر ما نراه عند تشغيل هذا البرنامج: .P .in +4n .EX $\fB ./a.out\fP; [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 .EE .in .SS "مصدر البرنامج" .\" SRC BEGIN (pthread_mutexattr_setrobust.c) .EX #include #include #include #include #include #include \& static pthread_mutex_t mtx; \& static void * original_owner_thread(void *ptr) { printf("[original owner] Setting lock...\[rs]n"); pthread_mutex_lock(&mtx); printf("[original owner] Locked. Now exiting without unlocking.\[rs]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.\[rs]n"); s = pthread_mutex_lock(&mtx); if (s == EOWNERDEAD) { printf("[main] pthread_mutex_lock() returned EOWNERDEAD\[rs]n"); printf("[main] Now make the mutex consistent\[rs]n"); s = pthread_mutex_consistent(&mtx); if (s != 0) errc(EXIT_FAILURE, s, "pthread_mutex_consistent"); printf("[main] Mutex is now consistent; unlocking\[rs]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\[rs]n"); exit(EXIT_FAILURE); } else { printf("[main] pthread_mutex_lock() unexpectedly failed\[rs]n"); errc(EXIT_FAILURE, s, "pthread_mutex_lock"); } } .EE .\" SRC END .SH "انظر أيضًا" .ad l .nh \fBget_robust_list\fP(2), \fBset_robust_list\fP(2), \fBpthread_mutex_consistent\fP(3), \fBpthread_mutex_init\fP(3), \fBpthread_mutex_lock\fP(3), \fBpthreads\fP(7) .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .