β’ ΡΡΠ½ΠΊΡΠΈΡ 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 ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π΄Π»Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΡΠΎΠ»ΡΠΊΠΎ ΠΌΠ°ΡΡΡΠ°Π± ΡΠΈΡΡΠ΅ΠΌΡ, ΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, ΠΊΠΎΠ³Π΄Π° Π²Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΠ΅ Π°ΡΡΠΈΠ±ΡΡ. (ΠΠ°ΡΡΡΠ°Π± ΡΠΈΡΡΠ΅ΠΌΡ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π·Π° ΠΎΠ±Π»Π°Π΄Π°Π½ΠΈΠ΅ ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ Π²ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΊΠΎΠ½ΠΊΡΡΠΈΡΡΡΡ Π΄ΡΡΠ³ Ρ Π΄ΡΡΠ³ΠΎΠΌ; ΠΌΠ°ΡΡΡΠ°Π± ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΆΠ΅ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΏΠΎΡΠΎΠΊΠΈ ΠΊΠΎΠ½ΠΊΡΡΠΈΡΡΡΡ Π·Π° ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΏΡΠ΅Π΄Π΅Π»Π°Ρ Β«ΡΠ²ΠΎΠ΅Π³ΠΎΒ» ΠΏΡΠΎΡΠ΅ΡΡΠ°, Π° Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠ΄ΡΠΎ).