sleep(3);
strcpy(message, "Bye!");
pthread_exit("Thank you for the CPU time");
}
ΠΡΠ°ΠΊ:
1. ΠΠ΅ΡΠ΅Π΄ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΠΌΠ°ΠΊΡΠΎΡ _REENTRANT. Π Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ Π²Ρ ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ _POSIX_C_SOURCE, Π½ΠΎ ΠΎΠ±ΡΡΠ½ΠΎ Π² ΡΡΠΎΠΌ Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ.
2. ΠΠ°Π»Π΅Π΅ Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°Π½Π° Ρ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ ΠΏΠΎΡΠΎΠΊΠΎΠ². Π ΡΠ»ΡΡΠ°Π΅ ΠΌΠ°Π»ΠΎΠ²Π΅ΡΠΎΡΡΠ½ΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΡΠ°ΡΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²Π° Linux, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ NPTL Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ Π²Π°Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ Π΅Π΅, Ρ ΠΎΡΡ Π±ΠΎΠ»ΡΡΠ°Ρ ΡΠ°ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π² ΡΡΠΎΠΉ Π³Π»Π°Π²Π΅, ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠ° ΡΠΎ ΡΡΠ°ΡΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π² Linux. ΠΠ΅Π³ΠΊΠΈΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ β Π·Π°Π³Π»ΡΠ½ΡΡΡ Π² ΡΠ°ΠΉΠ» /usr/include/pthread.h. ΠΡΠ»ΠΈ Π² ΡΡΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π΄Π°ΡΡ Π°Π²ΡΠΎΡΡΠΊΠΎΠ³ΠΎ ΠΏΡΠ°Π²Π° (copyright date) 2003 Π³. ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΠΉ, ΠΏΠΎΡΡΠΈ Π½Π°Π²Π΅ΡΠ½ΡΠΊΠ° Ρ Π²Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ NPTL. ΠΡΠ»ΠΈ ΡΠΊΠ°Π·Π°Π½Π° Π±ΠΎΠ»Π΅Π΅ ΡΠ°Π½Π½ΡΡ Π΄Π°ΡΠ°, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ, ΡΠ°ΠΌΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π²Π΅ΡΡΠΈΡ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²Π° Linux.
3. ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ² ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ² Π½ΡΠΆΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΈ ΡΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°ΡΡ Π²Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
$ cc -D_REENTRANT -I/usr/include/nptl threadl.Ρ -ΠΎ thread1 -L/usr/lib/nptl -lpthread
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ΠΡΠ»ΠΈ Π² Π²Π°ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π° NPTL (ΡΡΠΎ ΠΎΡΠ΅Π½Ρ Π²Π΅ΡΠΎΡΡΠ½ΠΎ), ΠΏΠΎΡΡΠΈ Π½Π°Π²Π΅ΡΠ½ΡΠΊΠ° Π²Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½Ρ ΠΎΠΏΡΠΈΠΈ -I ΠΈ -L, ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ:
$ cc -D_REENTRANT thread1.Ρ -ΠΎ thread1 -lpthread
Π Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΡΡΠΎΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΡΡΡΠΎΠΊΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ.
4. ΠΠΎΠ³Π΄Π° Π²Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΡΠΎ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ:
$ ./thread1
Waiting for thread to finish...
thread_function is running. Argument was Hello World
Thread joined, it returned Thank you for the CPU time
Message is now Bye!
Π‘ΡΠΎΠΈΡ ΠΏΠΎΡΡΠ°ΡΠΈΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π° Π°Π½Π°Π»ΠΈΠ· Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π΅ ΠΊΠ°ΠΊ ΠΎΡΠ½ΠΎΠ²Ρ Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ² ΡΡΠΎΠΉ Π³Π»Π°Π²Ρ.
ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
ΠΡ ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΡΠ΅ ΠΏΡΠΎΡΠΎΡΠΈΠΏ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΡ Π²ΡΠ·ΠΎΠ²Π΅Ρ ΠΏΠΎΡΠΎΠΊ, ΠΊΠΎΠ³Π΄Π° Π²Ρ Π΅Π³ΠΎ ΡΠΎΠ·Π΄Π°Π΄ΠΈΡΠ΅:
void *thread_function(void *arg);
ΠΠ°ΠΊ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡ pthread_create, Π΄Π°Π½Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ²ΠΎΠ΅Π³ΠΎ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° void ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° void. (ΠΡ ΠΏΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ thread_function ΡΠ΅ΡΠ΅Π· ΠΌΠΈΠ½ΡΡΡ.)
Π ΡΡΠ½ΠΊΡΠΈΠΈ main ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ pthread_create, ΡΡΠΎΠ±Ρ Π½Π°ΡΠ°ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°.
pthread_t a_thread;
void *thread_result;
res = pthread_create(&a_thread, NULL, thread_function, (void *)message);
ΠΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΠ΅ Π°Π΄ΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠΈΠΏΠ° pthread_t, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π² Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΌ Π΄Π»Ρ ΡΡΡΠ»ΠΊΠΈ Π½Π° ΠΏΠΎΡΠΎΠΊ. ΠΡ Π½Π΅ Ρ ΠΎΡΠΈΡΠ΅ ΠΌΠ΅Π½ΡΡΡ Π°ΡΡΠΈΠ±ΡΡΡ ΠΏΠΎΡΠΎΠΊΠ°, Π·Π°Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, ΠΏΠΎΡΡΠΎΠΌΡ Π²ΠΎ Π²ΡΠΎΡΠΎΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΠ΅ NULL. ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ Π΄Π²Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° β Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΠΉ Π΅ΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ.
ΠΡΠ»ΠΈ Π²ΡΠ·ΠΎΠ² Π·Π°Π²Π΅ΡΡΠΈΠ»ΡΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ, ΡΠ΅ΠΏΠ΅ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π΄Π²Π° ΠΏΠΎΡΠΎΠΊΠ°. ΠΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΏΠΎΡΠΎΠΊ (main) ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΡΡΡ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΊΠΎΠ΄, ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΡΠΉ ΡΠ»Π΅Π΄ΠΎΠΌ Π·Π° ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ pthread_create, Π° Π½ΠΎΠ²ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π½Π°ΡΠΈΠ½Π°Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π² ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΎΠ±ΡΠ°Π·Π½ΠΎ Π½Π°Π·Π²Π°Π½Π½ΠΎΠΉ thread_function.
ΠΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΏΠΎΡΠΎΠΊ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, Π·Π°ΠΏΡΡΡΠΈΠ»ΡΡ Π»ΠΈ Π½ΠΎΠ²ΡΠΉ ΠΏΠΎΡΠΎΠΊ, ΠΈ Π·Π°ΡΠ΅ΠΌ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ pthread_join:
res = pthread_join(a_thread, &thread_result);
ΠΠ΄Π΅ΡΡ Π²Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΠΎΡΠΎΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΆΠ΄Π΅ΡΠ΅, ΡΡΠΎΠ±Ρ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡ, ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ. ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ Π²Π΅ΡΠ½ΡΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅, Π±ΡΠ΄Π΅Ρ ΠΆΠ΄Π°ΡΡ, ΠΏΠΎΠΊΠ° Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ Π½Π΅ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ. ΠΠ°ΡΠ΅ΠΌ ΠΎΠ½Π° Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ ΠΈΠ· ΠΏΠΎΡΠΎΠΊΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ.
ΠΠΎΠ²ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π½Π°ΡΠΈΠ½Π°Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Π·Π°ΠΏΡΡΠΊΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ thread_function, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΡΠ²ΠΎΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ, Π·Π°ΡΡΠΏΠ°Π΅Ρ Π½Π° ΠΊΠΎΡΠΎΡΠΊΠΈΠΉ ΠΏΠ΅ΡΠΈΠΎΠ΄, ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΈ Π·Π°ΡΠ΅ΠΌ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Ρ ΡΡΡΠΎΠΊΡ Π² ΠΏΠΎΡΠΎΠΊ main. ΠΠΎΠ²ΡΠΉ ΠΏΠΎΡΠΎΠΊ ΠΏΠΈΡΠ΅Ρ Π² ΡΠΎΡ ΠΆΠ΅ ΠΌΠ°ΡΡΠΈΠ² message, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ Ρ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° Π΅ΡΡΡ Π΄ΠΎΡΡΡΠΏ. ΠΡΠ»ΠΈ Π±Ρ Π²Ρ Π²ΡΠ·Π²Π°Π»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ fork Π²ΠΌΠ΅ΡΡΠΎ pthread_create, ΠΌΠ°ΡΡΠΈΠ² ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ» Π±Ρ ΡΠΎΠ±ΠΎΠΉ ΠΊΠΎΠΏΠΈΡ ΠΌΠ°ΡΡΠΈΠ²Π° message, Π° Π½Π΅ ΡΠ°ΠΌ ΠΌΠ°ΡΡΠΈΠ².
ΠΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅
Π ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠΈ 12.2 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Π²ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ². (ΠΡ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΠ΅ ΠΎΠ΄Π½ΠΎΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ, Π¦Π Π±ΡΠ΄Π΅Ρ ΠΈΡΠΊΡΡΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°ΡΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ, Π° Π½Π΅ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΎΠ±Π° ΠΏΠΎΡΠΎΠΊΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΠ΄ΡΠ° ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΠΌΠΈ ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌΠΈ.) ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²Ρ Π½Π΅ Π²ΡΡΡΠ΅ΡΠ°Π»ΠΈΡΡ Π΅ΡΠ΅ Ρ ΠΊΠ°ΠΊΠΈΠΌΠΈ-Π»ΠΈΠ±ΠΎ ΡΡΠ½ΠΊΡΠΈΡΠΌΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΎΡΠ΅Π½Ρ Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, Π΄Π΅Π»Π°ΡΡΠ°Ρ Π½Π΅ΡΡΠΎ, ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΠ΅ ΠΎΠΏΡΠΎΡΠΎΠΌ (polling) Π΄Π²ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ². Π ΡΠ½ΠΎΠ²Π° Π²Ρ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ΡΡ ΡΠ΅ΠΌ, ΡΡΠΎ Π²ΡΠ΅, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ, ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π²ΡΠΌΡ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 12.2. ΠΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Π²ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° thread2.c Π² ΡΡΠΎΠΌ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠΈ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π·Π° ΡΡΠ΅Ρ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ thread1.c. ΠΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠ΅Π³ΠΎΡΡ ΠΏΠΎΡΠΎΠΊΠ°.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅Π€Π°ΠΉΠ»Ρ Ρ ΠΏΠΎΠ»Π½ΡΠΌΠΈ ΡΠ΅ΠΊΡΡΠ°ΠΌΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³ΡΡΠ·ΠΈΡΡ Ρ Web-ΡΠ°ΠΉΡΠ° ΠΊΠ½ΠΈΠ³ΠΈ.
int run_now = 1;
ΠΠ°Π΄Π°ΠΉΡΠ΅ run_now ΡΠ°Π²Π½ΠΎΠΉ 1, ΠΊΠΎΠ³Π΄Π° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ main, ΠΈ 2, ΠΊΠΎΠ³Π΄Π° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π½ΠΎΠ²ΡΠΉ ΠΏΠΎΡΠΎΠΊ.
Π ΡΡΠ½ΠΊΡΠΈΡ main ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄:
int print_count1 = 0;
while (print_count1+ < 20) {
if (run_now == 1) {
printf("1");
run_now = 2;
} else {
sleep(1);
}
}
ΠΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ run_now ΡΠ°Π²Π½Π° 1, Π²ΡΠ²Π΅Π΄ΠΈΡΠ΅ "1" ΠΈ ΠΏΡΠΈΡΠ²ΠΎΠΉΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 2. Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²Ρ Π½Π° ΠΊΠΎΡΠΎΡΠΊΠΎΠ΅ Π²ΡΠ΅ΠΌΡ Π·Π°ΡΡΠΏΠ°Π΅ΡΠ΅ ΠΈ ΡΠ½ΠΎΠ²Π° ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. ΠΡ ΠΆΠ΄Π΅ΡΠ΅, ΠΏΠΎΠΊΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡΡ Π½Π° 1, ΠΏΡΠΎΠ²Π΅ΡΡΡ Π²ΡΠ΅ΠΌΡ ΠΎΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠ½ΠΎΠ²Π°. ΠΡΠΎΡ ΠΏΡΠΈΠ΅ΠΌ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΡΠΈΠΊΠ»Π°ΠΌ Π°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π΄Π΅ΡΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ (busy wait), Π½Π΅ΡΠΌΠΎΡΡΡ, Π½Π° ΡΠΎ, ΡΡΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π·Π°ΡΡΠΏΠ°Π΅Ρ Π½Π° ΡΠ΅ΠΊΡΠ½Π΄Ρ ΠΌΠ΅ΠΆΠ΄Ρ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΡΠΌΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°ΠΌΠΈ. ΠΠΎΠ·ΠΆΠ΅ Π² ΡΡΠΎΠΉ Π³Π»Π°Π²Π΅ Π²Ρ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅, ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ Π»ΡΡΡΠ΅.
Π ΡΡΠ½ΠΊΡΠΈΠΈ thread_function, Π³Π΄Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π²Π°Ρ Π½ΠΎΠ²ΡΠΉ ΠΏΠΎΡΠΎΠΊ, Π²Ρ Π΄Π΅Π»Π°Π΅ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, Π½ΠΎ Ρ ΠΏΡΠΎΡΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ.
int print_count2 = 0;
while (print_count2++ < 20) {
if (run_now == 2) {
printf("2");
run_now = 1;
} else {
sleep(1);
}
}
ΠΡ ΡΠ΄Π°Π»ΡΠ΅ΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Ρ.ΠΊ. ΠΎΠ½ΠΈ Π²Π°Ρ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΡΡ.
ΠΠΎΠ³Π΄Π° Π²Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΡΠΎ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π²ΡΠ²ΠΎΠ΄. (ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΡ, ΡΡΠΎ Π΄Π»Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²ΡΠ²ΠΎΠ΄Π°, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π½Π° ΠΌΠ°ΡΠΈΠ½Π΅ Ρ ΠΎΠ΄Π½ΠΎΡΠ΄Π΅ΡΠ½ΡΠΌ Π¦Π, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΠΊΡΠ½Π΄.)
$ cc -D_REENTRANT thread2.Ρ -ΠΎ thread2 -lpthread
$ ./thread2
12121212121212121212
Waiting for thread to finish...
Thread joined
ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
ΠΠ°ΠΆΠ΄ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π·Π°ΡΡΠ°Π²Π»ΡΠ΅Ρ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ, Π·Π°Π΄Π°Π²Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ run_now ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΎΠΆΠΈΠ΄Π°Ρ, ΠΏΠΎΠΊΠ° Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΡΡΠΎΠ±Ρ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. ΠΠ· ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡ ΠΎΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° ΠΊ Π΄ΡΡΠ³ΠΎΠΌΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ ΠΊΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΎΠ½Π° Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ ΡΠΎΡΠΊΡ, ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΎΠ±ΠΎΠΈΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ, β ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ run_now.
Π‘ΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ
Π ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ Π²Ρ Π²ΠΈΠ΄Π΅Π»ΠΈ, ΡΡΠΎ Π΄Π²Π° ΠΏΠΎΡΠΎΠΊΠ° Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ, Π½ΠΎ ΠΌΠ΅ΡΠΎΠ΄ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ Π½ΠΈΠΌΠΈ ΡΠΎΠΏΠΎΡΠ½ΡΠΉ ΠΈ ΠΎΡΠ΅Π½Ρ Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΉ. Π ΡΡΠ°ΡΡΡΡ, ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΡΠ΄ ΡΡΠ½ΠΊΡΠΈΠΉ, ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΡ Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Π»ΡΡΡΠΈΡ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΈ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π²Π°ΠΆΠ½ΡΠΌ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ°ΠΌ ΠΊΠΎΠ΄Π°.
Π ΡΡΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π΄Π²Π° ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΠΌΠ΅ΡΠΎΠ΄Π°: ΡΠ΅ΠΌΠ°ΡΠΎΡΡ, Π΄Π΅ΠΉΡΡΠ²ΡΡΡΠΈΠ΅ ΠΊΠ°ΠΊ ΡΡΠΎΡΠΎΠΆΠ°, ΠΎΡ ΡΠ°Π½ΡΡΡΠΈΠ΅ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΡ ΠΊΠΎΠ΄Π°, ΠΈ ΠΌΡΡΡΠ΅ΠΊΡΡ ΠΈΠ»ΠΈ ΠΈΡΠΊΠ»ΡΡΠ°ΡΡΠΈΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΡ, Π΄Π΅ΠΉΡΡΠ²ΡΡΡΠΈΠ΅ ΠΊΠ°ΠΊ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ (ΠΎΡΡΡΠ΄Π° ΠΈ ΠΈΠΌΡ β ΠΈΡΠΊΠ»ΡΡΠ°ΡΡΠΈΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ) Π΄Π»Ρ Π·Π°ΡΠΈΡΡ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠΎΠ² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΏΠΎΡ ΠΎΠΆΠΈ, ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΠΏΠΈΡΠ°Π½ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Ρ Π΄ΡΡΠ³ΠΎΠ³ΠΎ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ ΡΠΈΡΡΠ°ΡΠΈΠΈ, Π² ΠΊΠΎΡΠΎΡΡΡ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π΄Π΅Π»Π°Π΅Ρ ΠΎΠ΄ΠΈΠ½ Π±ΠΎΠ»Π΅Π΅ Π²ΡΡΠ°Π·ΠΈΡΠ΅Π»ΡΠ½ΡΠΌ, ΡΠ΅ΠΌ Π΄ΡΡΠ³ΠΎΠΉ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎΡΡΡΠΏΠΎΠΌ ΠΊ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ Π² ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, Π±ΠΎΠ»Π΅Π΅ Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΌ ΠΊΠ°ΠΆΠ΅ΡΡΡ ΠΈΡΠΊΠ»ΡΡΠ°ΡΡΠΈΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ ΠΈΠ»ΠΈ ΠΌΡΡΡΠ΅ΠΊΡ. ΠΠ»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠΎΠΌ ΠΊ ΡΡΠ΄Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π² ΡΠ΅Π»ΠΎΠΌ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ΅Π»Π΅ΡΠΎΠ½Π½ΠΎΠΉ Π»ΠΈΠ½ΠΈΠΈ ΠΈΠ· Π½Π°Π±ΠΎΡΠ°, Π²ΠΊΠ»ΡΡΠ°ΡΡΠ΅Π³ΠΎ ΠΏΡΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ Π»ΠΈΠ½ΠΈΠΉ, Π±ΠΎΠ»ΡΡΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ ΡΠ΅ΠΌΠ°ΡΠΎΡ. ΠΠ°ΠΊΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π²ΡΠ±Π΅ΡΠΈΡΠ΅ Π²Ρ, Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ Π»ΠΈΡΠ½ΡΡ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠ΅Π½ΠΈΠΉ ΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠ΅Π³ΠΎ Π΄Π»Ρ Π²Π°ΡΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°.
Π‘ΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ²
ΠΠ»Ρ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² Π΅ΡΡΡ Π΄Π²Π° Π½Π°Π±ΠΎΡΠ° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ: ΠΎΠ΄ΠΈΠ½ Π²Π·ΡΡ ΠΈΠ· POSIX Realtime Extensions (Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ POSIX Π΄Π»Ρ ΡΠ΅ΠΆΠΈΠΌΠ° ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ) ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ², Π° Π΄ΡΡΠ³ΠΎΠΉ, ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠΉ ΠΊΠ°ΠΊ ΡΠ΅ΠΌΠ°ΡΠΎΡΡ System V, ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ². (ΠΡ ΠΎΠ±ΡΡΠ΄ΠΈΠΌ Π²ΡΠΎΡΠΎΠΉ ΡΠΈΠΏ Π² Π³Π»Π°Π²Π΅ 14.) ΠΠ±Π° Π½Π°Π±ΠΎΡΠ° Π½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΡΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ·Π°ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡΠΈ ΠΈ Ρ ΠΎΡΡ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΡ ΠΎΠΆΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Π²ΡΠ·ΠΎΠ²Ρ ΡΠ°Π·Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ.