#include <unistd.h>#include <stdlib.h>#include <pthread.h>void *thread_function(void *arg);char message[] = "Hello World";int thread_finished = 0;int main() {Β int res;Β pthread_t a_thread;Β pthread_attr_t thread_attr;Β res = pthread_attr_init(&thread_attr);Β if (res != 0) {Β perror("Attribute creation failed");Β Β exit(EXIT_FAILURE);Β }Β res = pthread_attr_setdetachstate(&thread_attr,Β PTHREAD_CREATE_DETACHED);Β if (res != 0) {Β perror("Setting detached attribute failed");Β exit(EXIT_FAILURE);Β }Β res = pthread_create(&a_thread, &thread_attr,Β thread_function, (void *)message);Β if (res != 0) {Β perror("Thread creation failed");Β Β exit(EXIT_FAILURE);Β }Β (void)pthread_attr_destroy(&thread_attr);Β while (!thread_finished) {Β printf("Waiting for thread to say it's finished...\n");Β Β sleep(1);Β }Β printf("Other thread finished, bye!\n");Β exit(EXIT_SUCCESS);}void *thread_function(void *arg) {Β printf("thread_function is running. Argument was %s\n", (char *)arg);Β sleep(4);Β printf("Second thread setting finished flag, and exiting now\n");Β thread_finished = 1;Β pthread_exit(NULL);}ΠΡΠ²ΠΎΠ΄ Π½Π΅ ΠΏΡΠΈΠ½Π΅ΡΠ΅Ρ ΡΡΡΠΏΡΠΈΠ·ΠΎΠ²:
$ <b>./threads</b>Waiting for thread to say it's finished...thread_function is running. Argument was Hello WorldWaiting for thread to say it's finished...Waiting for thread to say it's finished...Waiting for thread to say it's finished...Second thread setting finished flag, and exiting nowOther thread finished, bye!ΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡΠ΅, ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΠΎΡΠΎΠΌΡ ΠΏΠΎΡΠΎΠΊΡ Π·Π°Π²Π΅ΡΡΠΈΡΡΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ, Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΏΠΎΡΠΎΠΊΡ ΠΆΠ΄Π°ΡΡ ΡΡΠΎΠ³ΠΎ ΡΠΎΠ±ΡΡΠΈΡ.
ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
Π ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌ ΡΠ΅ΠΊΡΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π΄Π²Π° Π²Π°ΠΆΠ½ΡΡ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ°:
pthread_attr_t thread_attr;res = pthread_attr_init(&thread_attr);if (res != 0) {Β perror("Attribute creation failed");Β exit(EXIT_FAILURE);}ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±ΡΡΠ²Π»ΡΠ΅Ρ Π°ΡΡΠΈΠ±ΡΡ ΠΏΠΎΡΠΎΠΊΠ° ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ Π΅Π³ΠΎ, ΠΈ
res = pthread_attr_setdetachstatΠ΅(&thread_attr, PTHREAD_CREATE_DETACHED);if (res != 0) {Β perror("Setting detached attribute failed");Β exit(EXIT_FAILURE);}ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² Π΄Π»Ρ Π·Π°Π΄Π°Π½ΠΈΡ ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°.
Π Π΄ΡΡΠ³ΠΈΠΌ Π½Π΅Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΠΌ ΠΎΡΠ»ΠΈΡΠΈΡΠΌ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠ° Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ΠΉ Π°Π΄ΡΠ΅ΡΠ° Π°ΡΡΠΈΠ±ΡΡΠΎΠ²:
res = pthread_create(&a_thread, &thread_attr, thread_function, (void*)message);ΠΈ Π΄Π»Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½Π½ΠΎΡΡΠΈ ΡΠ½ΠΈΡΡΠΎΠΆΠ΅Π½ΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² ΠΏΠΎΡΠ»Π΅ ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ:
pthread_attr_destroy(&thread_attr);ΠΡΡΠΈΠ±ΡΡΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π²ΡΠΎΡΠΎΠΉ Π°ΡΡΠΈΠ±ΡΡ ΠΏΠΎΡΠΎΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π²Π°ΠΌ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π·Π°Ρ ΠΎΡΠ΅ΡΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ, β Π°ΡΡΠΈΠ±ΡΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ Π°ΡΡΠΈΠ±ΡΡΠ° ΠΎΡΠ΅Π½Ρ ΠΏΠΎΡ ΠΎΠΆΠ΅ Π½Π° ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°, Π½ΠΎ Π΅ΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π΄Π»Ρ ΠΏΠΎΠ΄Π±ΠΎΡΠ° Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΡ ΡΡΠΎΠ²Π½Π΅ΠΉ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ°,
sched_get_priority_maxsched_get_priority_minΠΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 12.6.
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΄Π°Π½Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° thread6.c ΠΎΡΠ΅Π½Ρ ΠΏΠΎΡ ΠΎΠΆΠ° Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΡ, ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΡΠ»ΠΈΡΠΈΡ.
1.Β ΠΡΠ΅ΠΆΠ΄Π΅ Π²ΡΠ΅Π³ΠΎ, Π²Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ :
int max_priority;int min_priority;struct sched_param scheduling_value;2.Β ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Π°ΡΡΠΈΠ±ΡΡ ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ, Π²Ρ Π·Π°Π΄Π°Π΅ΡΠ΅ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ:
res = pthread_attr_setschedpolicy(&thread_attr, SCHED_OTHER);if (res != 0) {Β perror("Setting scheduling policy failed");Β exit(EXIT_FAILURE);}3.Β ΠΠ°Π»Π΅Π΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΠ΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠ²
max_priority = sched_get_priority_max(SCHED_OTHER);min_priority = sched_get_priority_min(SCHED_OTHER);ΠΈ Π·Π°Π΄Π°Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ :
scheduling_value.sched_priority = min_priority;res = pthread_attr_setschedparam(&thread_attr, &scheduling_value);if (res != 0) {Β perror("Setting scheduling priority failed");