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 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

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