Scroll to navigation

pthread_attr_init(3) Library Functions Manual pthread_attr_init(3)

الاسم

pthread_attr_init, pthread_attr_destroy - تهيئة وتدمير كائن سمات الخيط

المكتبة

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

موجز

#include <pthread.h>
int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy(pthread_attr_t *attr);

الوصف

الدالة pthread_attr_init() تهيئ كائن سمات الخيط المشار إليه بواسطة attr بقيم سمات مبدئية. بعد هذه الاستدعاء، يمكن تعيين سمات فردية للكائن باستخدام دوال ذات صلة متنوعة (مدرجة تحت انظر أيضًا)، ثم يمكن استخدام الكائن في استدعاء واحد أو أكثر من pthread_create(3) التي تنشئ خيوطًا.

استدعاء pthread_attr_init() على كائن سمات خيط سبق تهيئته يؤدي إلى سلوك غير محدد.

عندما لا يعود كائن سمات الخيط مطلوبًا، يجب تدميره باستخدام الدالة pthread_attr_destroy(). تدمير كائن سمات الخيط لا يؤثر على الخيوط التي أُنشئت باستخدام ذلك الكائن.

بمجرد تدمير كائن سمات الخيط، يمكن إعادة تهيئته باستخدام pthread_attr_init(). أي استخدام آخر لكائن سمات خيط مدمر يؤدي إلى نتائج غير محددة.

قيمة الإرجاع

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

الأخطاء

يُوثق POSIX.1 خطأ ENOMEM لـ pthread_attr_init()؛ على لينكس تنجح هذه الدوال دائمًا (لكن التطبيقات المحمولة والمقاومة للمستقبل يجب مع ذلك معالجة إرجاع خطأ محتمل).

السمات

للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر attributes(7).

الواجهة السمة القيمة
pthread_attr_init(), pthread_attr_destroy() سلامة الخيوط MT-Safe

المعايير

POSIX.1-2008.

التاريخ

POSIX.1-2001.

ملاحظات

يجب معاملة النوع pthread_attr_t على أنه معتم: أي وصول إلى الكائن بخلاف دوال pthreads غير محمول وينتج نتائج غير محددة.

أمثلة

البرنامج أدناه يستخدم اختياريًا pthread_attr_init() ودوال ذات صلة متنوعة لتهيئة كائن سمات خيط يُستخدم لإنشاء خيط واحد. بمجرد الإنشاء، يستخدم الخيط الدالة pthread_getattr_np(3) (إضافة GNU غير قياسية) لاسترداد سمات الخيط، ثم يعرض تلك السمات.

إذا شُغّل البرنامج بدون وسيط سطر أوامر، فإنه يمرر NULL كوسيط attr لـ pthread_create(3)، بحيث يُنشأ الخيط بسمات مبدئية. بتشغيل البرنامج على Linux/x86-32 مع تطبيق خيوط NPTL، نرى ما يلي:


$ ulimit -s       # No stack limit ==> default stack size is 2 MB
unlimited
$ ./a.out
Thread attributes:

Detach state = PTHREAD_CREATE_JOINABLE
Scope = PTHREAD_SCOPE_SYSTEM
Inherit scheduler = PTHREAD_INHERIT_SCHED
Scheduling policy = SCHED_OTHER
Scheduling priority = 0
Guard size = 4096 bytes
Stack address = 0x40196000
Stack size = 0x201000 bytes

عندما نقدم حجم المكدس كوسيط سطر أوامر، يهيئ البرنامج كائن سمات خيط، ويضبط سمات متنوعة في ذلك الكائن، ويمرر مؤشرًا إلى الكائن في استدعاء pthread_create(3). بتشغيل البرنامج على Linux/x86-32 مع تطبيق خيوط NPTL، نرى ما يلي:


$ ./a.out 0x3000000
posix_memalign() allocated at 0x40197000
Thread attributes:

Detach state = PTHREAD_CREATE_DETACHED
Scope = PTHREAD_SCOPE_SYSTEM
Inherit scheduler = PTHREAD_EXPLICIT_SCHED
Scheduling policy = SCHED_OTHER
Scheduling priority = 0
Guard size = 0 bytes
Stack address = 0x40197000
Stack size = 0x3000000 bytes

مصدر البرنامج

#define _GNU_SOURCE     /* To get pthread_getattr_np() declaration */
#include <err.h>
#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
static void
display_pthread_attr(pthread_attr_t *attr, char *prefix)
{

int s, i;
size_t v;
void *stkaddr;
struct sched_param sp;
s = pthread_attr_getdetachstate(attr, &i);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_attr_getdetachstate");
printf("%sDetach state = %s\n", prefix,
(i == PTHREAD_CREATE_DETACHED) ? "PTHREAD_CREATE_DETACHED" :
(i == PTHREAD_CREATE_JOINABLE) ? "PTHREAD_CREATE_JOINABLE" :
"???");
s = pthread_attr_getscope(attr, &i);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_attr_getscope");
printf("%sScope = %s\n", prefix,
(i == PTHREAD_SCOPE_SYSTEM) ? "PTHREAD_SCOPE_SYSTEM" :
(i == PTHREAD_SCOPE_PROCESS) ? "PTHREAD_SCOPE_PROCESS" :
"???");
s = pthread_attr_getinheritsched(attr, &i);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_attr_getinheritsched");
printf("%sInherit scheduler = %s\n", prefix,
(i == PTHREAD_INHERIT_SCHED) ? "PTHREAD_INHERIT_SCHED" :
(i == PTHREAD_EXPLICIT_SCHED) ? "PTHREAD_EXPLICIT_SCHED" :
"???");
s = pthread_attr_getschedpolicy(attr, &i);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_attr_getschedpolicy");
printf("%sScheduling policy = %s\n", prefix,
(i == SCHED_OTHER) ? "SCHED_OTHER" :
(i == SCHED_FIFO) ? "SCHED_FIFO" :
(i == SCHED_RR) ? "SCHED_RR" :
"???");
s = pthread_attr_getschedparam(attr, &sp);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_attr_getschedparam");
printf("%sScheduling priority = %d\n", prefix, sp.sched_priority);
s = pthread_attr_getguardsize(attr, &v);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_attr_getguardsize");
printf("%sGuard size = %zu bytes\n", prefix, v);
s = pthread_attr_getstack(attr, &stkaddr, &v);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_attr_getstack");
printf("%sStack address = %p\n", prefix, stkaddr);
printf("%sStack size = %#zx bytes\n", prefix, v); } static void * thread_start(void *arg) {
int s;
pthread_attr_t gattr;
/* pthread_getattr_np() is a non-standard GNU extension that
retrieves the attributes of the thread specified in its
first argument. */
s = pthread_getattr_np(pthread_self(), &gattr);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_getattr_np");
printf("Thread attributes:\n");
display_pthread_attr(&gattr, "\t");
exit(EXIT_SUCCESS); /* Terminate all threads */ } int main(int argc, char *argv[]) {
pthread_t thr;
pthread_attr_t attr;
pthread_attr_t *attrp; /* NULL or &attr */
int s;
attrp = NULL;
/* If a command-line argument was supplied, use it to set the
stack-size attribute and set a few other thread attributes,
and set attrp pointing to thread attributes object. */
if (argc > 1) {
size_t stack_size;
void *sp;
attrp = &attr;
s = pthread_attr_init(&attr);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_attr_init");
s = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_attr_setdetachstate");
s = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_attr_setinheritsched");
stack_size = strtoul(argv[1], NULL, 0);
s = posix_memalign(&sp, sysconf(_SC_PAGESIZE), stack_size);
if (s != 0)
errc(EXIT_FAILURE, s, "posix_memalign");
printf("posix_memalign() allocated at %p\n", sp);
s = pthread_attr_setstack(&attr, sp, stack_size);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_attr_setstack");
}
s = pthread_create(&thr, attrp, &thread_start, NULL);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_create");
if (attrp != NULL) {
s = pthread_attr_destroy(attrp);
if (s != 0)
errc(EXIT_FAILURE, s, "pthread_attr_destroy");
}
pause(); /* Terminates when other thread calls exit() */ }

انظر أيضًا

pthread_attr_setaffinity_np(3), pthread_attr_setdetachstate(3), pthread_attr_setguardsize(3), pthread_attr_setinheritsched(3), pthread_attr_setschedparam(3), pthread_attr_setschedpolicy(3), pthread_attr_setscope(3), pthread_attr_setsigmask_np(3), pthread_attr_setstack(3), pthread_attr_setstackaddr(3), pthread_attr_setstacksize(3), pthread_create(3), pthread_getattr_np(3), pthread_setattr_default_np(3), pthreads(7)

ترجمة

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

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

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

21 سبتمبر 2025 صفحات دليل لينكس 6.18