.\" -*- coding: UTF-8 -*- .\" 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_key_create 3 "17 مايو 2025" "صفحات دليل لينكس 6.18" . . .SH الاسم pthread_key_create, pthread_key_delete, pthread_setspecific, pthread_getspecific \- إدارة بيانات خاصة بالخيط . . .SH موجز .nf \fB#include \fP .P \fBint pthread_key_create(pthread_key_t *\fP\fIkey\fP\fB,\fP \fB typeof(void (void *)) *\fP\fIdestr_function\fP\fB;\fP \fBint pthread_key_delete(pthread_key_t \fP\fIkey\fP\fB);\fP \fBint pthread_setspecific(pthread_key_t \fP\fIkey\fP\fB, const void *\fP\fIpointer\fP\fB);\fP \fBvoid * pthread_getspecific(pthread_key_t \fP\fIkey\fP\fB);\fP .fi . . .SH الوصف غالبًا ما تحتاج البرامج إلى متغيرات عامة أو ثابتة لها قيم مختلفة في خيوط مختلفة. نظرًا لأن الخيوط تشترك في مساحة ذاكرة واحدة، لا يمكن تحقيق ذلك باستخدام المتغيرات العادية. البيانات الخاصة بالخيط هي إجابة خيوط POSIX لهذه الحاجة. .P يمتلك كل خيط كتلة ذاكرة خاصة، منطقة البيانات الخاصة بالخيط، أو منطقة TSD للاختصار. تُفهرس هذه المنطقة بمفاتيح TSD. تربط منطقة TSD قيمًا من النوع \fIvoid\ *\fP بمفاتيح TSD. مفاتيح TSD مشتركة بين جميع الخيوط، لكن القيمة المرتبطة بمفتاح TSD معين يمكن أن تكون مختلفة في كل خيط. .P للتحديد، يمكن عرض مناطق TSD كمصفوفات من المؤشرات \fIvoid\ *\fP، ومفاتيح TSD كمؤشرات صحيحة إلى هذه المصفوفات، وقيمة مفتاح TSD كقيمة عنصر المصفوفة المقابل في الخيط المستدعي. .P عند إنشاء خيط، تربط منطقة TSD الخاصة به مبدئيًا NULL بجميع المفاتيح. .P تخصص \fBpthread_key_create\fP() مفتاح TSD جديد. يُخزَّن المفتاح في الموقع المشار إليه بواسطة \fIkey\fP. يوجد حد أقصى قدره \fBPTHREAD_KEYS_MAX\fP على عدد المفاتيح المخصصة في وقت معين. القيمة المرتبطة مبدئيًا بالمفتاح المُعاد هي NULL في جميع الخيوط المنفذة حاليًا. .P الوسيطة \fIdestr_function\fP، إن لم تكن NULL، تحدد دالة مدمرة مرتبطة بالمفتاح. عندما يُنهى خيط عبر \fBpthread_exit\fP() أو بالإلغاء، تُستدعى \fIdestr_function\fP مع وسائط القيمة المرتبطة بالمفتاح في ذلك الخيط. لا تُستدعى \fIdestr_function\fP إذا كانت تلك القيمة NULL. الترتيب الذي تُستدعى به الدوال المدمرة عند وقت إنهاء الخيط غير محدد. .P قبل استدعاء الدالة المدمرة، تُربط القيمة NULL بالمفتاح في الخيط الحالي. قد تعيد الدالة المدمرة، مع ذلك، ربط قيم غير NULL بذلك المفتاح أو بمفتاح آخر. للتعامل مع هذا، إذا بعد استدعاء جميع المدمرات لجميع القيم غير NULL، بقيت بعض القيم غير NULL مع مدمرات مرتبطة، تُكرر العملية. يوقف تطبيق glibc العملية بعد \fBPTHREAD_DESTRUCTOR_ITERATIONS\fP تكرارات، حتى لو بقيت بعض القيم غير NULL مع مدمرات مرتبطة. قد تكرر التطبيقات الأخرى إلى أجل غير مسمى. .P تلغي \fBpthread_key_delete\fP() تخصيص مفتاح TSD. لا تتحقق مما إذا كانت قيم غير NULL مرتبطة بذلك المفتاح في الخيوط المنفذة حاليًا، ولا تستدعي الدالة المدمرة المرتبطة بالمفتاح. .P تغير \fBpthread_setspecific\fP() القيمة المرتبطة بـ \fIkey\fP في الخيط المستدعي، مخزنة \fIpointer\fP المعطى بدلاً من ذلك. .P ترجع \fBpthread_getspecific\fP() القيمة المرتبطة حاليًا بـ \fIkey\fP في الخيط المستدعي. . . .SH "قيمة الإرجاع" ترجع \fBpthread_key_create\fP() و \fBpthread_key_delete\fP() و \fBpthread_setspecific\fP() 0 عند النجاح ورمز خطأ غير صفري عند الفشل. إذا نجحت، تخزن \fBpthread_key_create\fP() المفتاح المخصص حديثًا في الموقع المشار إليه بواسطة وسيطتها \fIkey\fP. .P ترجع \fBpthread_getspecific\fP() القيمة المرتبطة بـ \fIkey\fP عند النجاح، وNULL عند الخطأ. . . .SH الأخطاء ترجع \fBpthread_key_create\fP() رمز الخطأ التالي عند الخطأ: .RS .TP \fBEAGAIN\fP مفاتيح \fBPTHREAD_KEYS_MAX\fP مخصصة بالفعل. .RE .P ترجع \fBpthread_key_delete\fP() و \fBpthread_setspecific\fP() رمز الخطأ التالي عند الخطأ: .RS .TP \fBEINVAL\fP \fIkey\fP ليس مفتاح TSD صالحًا ومخصصًا. .RE .P ترجع \fBpthread_getspecific\fP() NULL إذا كان \fIkey\fP ليس مفتاح TSD صالحًا ومخصصًا. . . .SH "انظر أيضًا" pthread_create(3), pthread_exit(3), pthread_testcancel(3). . . .SH مثال يُخصص مقطع الشيفرة التالي مصفوفة خاصة بالخيط من 100 حرف، مع استعادة آلية عند خروج الخيط: .P .RS .nf .sp \fB/* Key for the thread\-specific buffer */ static pthread_key_t buffer_key; \& /* Once\-only initialisation of the key */ static pthread_once_t buffer_key_once = PTHREAD_ONCE_INIT; \& /* Allocate the thread\-specific buffer */ void buffer_alloc(void) { pthread_once(&buffer_key_once, buffer_key_alloc); pthread_setspecific(buffer_key, malloc(100)); } \& /* Return the thread\-specific buffer */ char * get_buffer(void) { return (char *) pthread_getspecific(buffer_key); } \& /* Allocate the key */ static void buffer_key_alloc() { pthread_key_create(&buffer_key, buffer_destroy); } \& /* Free the thread\-specific buffer */ static void buffer_destroy(void * buf) { free(buf); }\fP .RE .fi .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .