Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² QNX/Neutrino 2. Руководство ΠΏΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² QNX Realtime PlatformΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 11

Автор Π ΠΎΠ± ΠšΡ‘Ρ€Ρ‚Π΅Π½

β€’ Ρ„ункция fork() Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с нСсколькими ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ β€” см. Π²Ρ‹ΡˆΠ΅;

β€’ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с fork() Π² условиях многопоточности Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ pthread_atfork() ΠΈ Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ мутСкс ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΠ΅Ρ€Π΅Π΄ собствСнно Π²Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠ΅ΠΌ, Π° это услоТнит структуру ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹;

β€’ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ процСссы, созданныС fork(), ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ всС ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ дСскрипторы Ρ„Π°ΠΉΠ»ΠΎΠ². Как ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ ΠΏΠΎΠ·ΠΆΠ΅ Π² Π³Π»Π°Π²Π΅ «Администратор рСсурсов», это Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… усилий, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ напрасными, Ссли Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс Π·Π°Ρ‚Π΅ΠΌ сразу сдСлаСт exec() ΠΈ Ρ‚Π΅ΠΌ самым Π·Π°ΠΊΡ€ΠΎΠ΅Ρ‚ всС ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ дСскрипторы.

Π’Ρ‹Π±ΠΎΡ€ ΠΌΠ΅ΠΆΠ΄Ρƒ сСмСйствами Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ vfork() ΠΈ spawn() сводится ΠΊ пСрСносимости, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΈ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс. Ѐункция vfork() Π·Π°Π΄Π΅Ρ€ΠΆΠΈΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс Π½Π΅ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ exec() ΠΈΠ»ΠΈ Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ сСмСйство spawn() ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΠ±ΠΎΠΈΠΌ процСссам ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Π² Ρ€Π°Π·Π½Ρ‹Ρ… ОБ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ vfork() ΠΌΠΎΠΆΠ΅Ρ‚ нСсколько ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ.

Запуск ΠΏΠΎΡ‚ΠΎΠΊΠ°

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ процСсс, Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим, ΠΊΠ°ΠΊ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ запуск Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°.

Π›ΡŽΠ±ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ самом процСссС; Π½Π° это Π½Π΅ налагаСтся Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ (Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ объСма памяти, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ!) НаиболСС ΠΎΠ±Ρ‰ΠΈΠΉ ΠΏΡƒΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ этого β€” использованиС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ POSIX pthread_create():

#include <pthread.h>

int pthread_create(pthread_t *thread,

 const pthread_attr_t *attr,

 void*(*start_routine)(void*), void *arg);

Ѐункция pthread_create() ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° :

thread ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° pthread_t, Π³Π΄Π΅ хранится ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΡ‚ΠΎΠΊΠ° attr атрибутная запись start_routine ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ начинаСтся ΠΏΠΎΡ‚ΠΎΠΊ arg ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСдаСтся ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ start_routine

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ thread ΠΈ атрибутная запись (attr) β€” Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ элСмСнты, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ вмСсто Π½ΠΈΡ… NULL.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ thread ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для хранСния ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° вновь создаваСмого ΠΏΠΎΡ‚ΠΎΠΊΠ°. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π½ΠΈΠΆΠ΅, ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ NULL, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΠ² этим, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ заботимся ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ вновь создаваСмый ΠΏΠΎΡ‚ΠΎΠΊ.

Если Π±Ρ‹ Π½Π°ΠΌ Π±Ρ‹Π»ΠΎ Π΄ΠΎ этого Π΄Π΅Π»ΠΎ, ΠΌΡ‹ Π±Ρ‹ сдСлали Ρ‚Π°ΠΊ:

pthread_t tid;

pthread_create(&tid, ...

printf("Новый ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ %d\n", tid);

Π’Π°ΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ часто ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ выполняСт ΠΊΠ°ΠΊΠΎΠΉ участок ΠΊΠΎΠ΄Π°.

НСбольшой Ρ‚ΠΎΠ½ΠΊΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. Новый ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ Π΄ΠΎ присвоСния значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ tid. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚ΡŒΡΡ ΠΊ использованию tid Π² качСствС глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅, всС Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ² pthread_create() ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π» Π΄ΠΎ использования tid, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ использования tid ΠΈΠΌΠ΅Π» ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Новый ΠΏΠΎΡ‚ΠΎΠΊ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ start_routine(), с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ arg.

Атрибутная запись ΠΏΠΎΡ‚ΠΎΠΊΠ°

Когда Π²Ρ‹ осущСствляСтС запуск Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ряду Ρ‡Π΅Ρ‚ΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… установок ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΈΠ»ΠΈ ΠΆΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ явно Π·Π°Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ характСристики.

ΠŸΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΠΎΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΡŽ задания Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΏΠΎΡ‚ΠΎΠΊΠ°, рассмотрим Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… pthread_attr_t:

typedef struct {

 int flags;

 size_t   stacksize;

 void     *stackaddr;

 void     (*exitfunc)(void *status);

 int      policy;

 struct   sched_param param;

 unsigned guardsize;

} pthread_attr_t;

Π’ основном эти поля ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ:

flags НСисчисляСмыС (Π±ΡƒΠ»Π΅Π²Ρ‹) характСристики ΠΏΠΎΡ‚ΠΎΠΊΠ° β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, создаСтся ΠΏΠΎΡ‚ΠΎΠΊ ΠΊΠ°ΠΊ «обособлСнный» ΠΈΠ»ΠΈ Β«ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉΒ». stacksize, stackaddr ΠΈ guardsize ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ стСка. exitfunc Ѐункция, выполняСмая ΠΏΠ΅Ρ€Π΅Π΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ°. policy ΠΈ param ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ диспСтчСризации.

Доступны ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ

pthread_attr_destroy()

pthread_attr_init()

Π€Π»Π°Π³ΠΈ (Π±ΡƒΠ»Π΅Π²Ρ‹ характСристики)

pthread_attr_getdetachstate()

pthread_attr_setdetachstate()

pthread_attr_getinheritsched()

pthread_attr_setinheritsched()

pthread_attr_getscope()

pthread_attr_setscope()

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ стСка

pthread_attr_getguardsize()

pthread_attr_setguardsize()

pthread_attr_getstackaddr()

pthread_attr_setstackaddr()

pthread_attr_getstacksize()

pthread_attr_setstacksize()

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ диспСтчСризации

pthread_attr_getschedparam()

pthread_attr_setschedparam()

pthread_attr_getschedpolicy()

pthread_attr_setschedpolicy()

Бписок выглядит довольно большим (18 Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ), Π½ΠΎ Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ нас Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ· этого списка, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ всС эти ΠΎΠ½ΠΈ сгруппированы ΠΏΠΎ ΠΏΠ°Ρ€Π°ΠΌ Β«getΒ» β€” Β«setΒ», Ρ‚.Π΅. Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ°Ρ€Π΅ Π΅ΡΡ‚ΡŒ функция ΠΊΠ°ΠΊ получСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (get), Ρ‚Π°ΠΊ ΠΈ ΠΈΡ… установки (set) β€” Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ pthread_attr_init() ΠΈ pthread_attr_destroy().

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΡ‹ исслСдуСм назначСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², слСдуСт ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ. Π’Ρ‹ обязаны Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ pthread_attr_init() для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠΉ записи Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π΅Π΅ использования, Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ) pthread_attr_set*() ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pthread_create() для создания ΠΏΠΎΡ‚ΠΎΠΊΠ°. ИзмСнСниС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠΉ записи послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΡ‚ΠΎΠΊ ΡƒΠΆΠ΅ создан, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ дСйствия.

АдминистрированиС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΏΠΎΡ‚ΠΎΠΊΠ°

ΠŸΠ΅Ρ€Π΅Π΄ использованиСм Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠΉ записи для Π΅Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ слСдуСт Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pthread_attr_init():

...

pthread_attr_t attr;

...

pthread_attr_init(&attr);

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ pthread_attr_destroy() для Β«Π΄Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈΒ» Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠΉ записи ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π½ΠΎ Ρ‚Π°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ (Ссли Π½Π΅ трСбуСтся ТСсткой POSIX-совмСстимости).

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π½ΠΈΠΆΠ΅ описаниях значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅ΠΌ Β«(ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ)Β».

Атрибут ΠΏΠΎΡ‚ΠΎΠΊΠ° Β«flagsΒ» (Ρ„Π»Π°Π³ΠΈ)

Π’Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” pthread_attr_setdetachstate(), pthread_attr_setinheritsched() ΠΈ pthread_attr_setscope() β€” ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚, создаСтся Π»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ ΠΊΠ°ΠΊ Β«ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉΒ» (Β«joinableΒ») ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ «обособлСнный» (detached), наслСдуСт Π»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ диспСтчСризации ΠΎΡ‚ ΡΠΎΠ·Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ диспСтчСризации, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² функциях pthread_attr_setschedparam() ΠΈ pthread_attr_setschedpolicy(), ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΈΠΌΠ΅Π΅Ρ‚ Π»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠ°ΡΡˆΡ‚Π°Π± «систСмы» ΠΈΠ»ΠΈ «процСсса».

Для создания Β«ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎΒ» ΠΏΠΎΡ‚ΠΎΠΊΠ° (это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ с Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ΠΌ этого ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_join()), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²Ρ‹Π·ΠΎΠ²:

(ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ)

pthread_attr_setdetachstate(&attr,

 PTHREAD_CREATE_JOINABLE);

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ, синхронизация с Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° (Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ «обособлСнным»), Π½Π°Π΄ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

pthread_attr_setdetachstate(&attr,

 PTHREAD_CREATE_DETACHED);

Если Π²Ρ‹ ΠΆΠ΅Π»Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊ унаслСдовал Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ диспСтчСризации ΠΎΡ‚ ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π΅Π³ΠΎ ΡΠΎΠ·Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΈΠΌΠ΅Π» Π±Ρ‹ Ρ‚Ρƒ ΠΆΠ΅ ΡΠ°ΠΌΡƒΡŽ дисциплину диспСтчСризации ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΈ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ), Π²Π°ΠΌ слСдуСт ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ:

(ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ)

pthread_attr_setinheritsched(&attr, PTHREAD_INHERIT_SCHED);

Для создания ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ диспСтчСризации, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π² нСпосрСдствСнно Π² Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠΉ записи (это дСлаСтся ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ pthread_attr_setsetschedparam() ΠΈ pthread_attr_setschedpolicy()), Π²Ρ‹Π·ΠΎΠ² выглядСл Π±Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

pthread_attr_setinheritsched(&attr,

 PTHREAD_EXPLICIT_SCHED);

И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, функция pthread_attr_setscope(). Π’Π°ΠΌ Π½Π΅ придСтся Π΅Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½ΠΈΠΊΠΎΠ³Π΄Π°. ΠŸΠΎΡ‡Π΅ΠΌΡƒ? ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ QNX/Neutrino ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π± систСмы, ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ устанавливаСтся ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚. (ΠœΠ°ΡΡˆΡ‚Π°Π± систСмы ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π·Π° ΠΎΠ±Π»Π°Π΄Π°Π½ΠΈΠ΅ рСсурсами всС ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π² систСмС ΠΊΠΎΠ½ΠΊΡƒΡ€ΠΈΡ€ΡƒΡŽΡ‚ Π΄Ρ€ΡƒΠ³ с Π΄Ρ€ΡƒΠ³ΠΎΠΌ; ΠΌΠ°ΡΡˆΡ‚Π°Π± процСсса ΠΆΠ΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΊΠΎΠ½ΠΊΡƒΡ€ΠΈΡ€ΡƒΡŽΡ‚ Π·Π° процСссор Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… «своСго» процСсса, Π° Π΄ΠΈΡΠΏΠ΅Ρ‚Ρ‡Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ процСссов выполняСт ядро).