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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 224

Автор ΠœΡΡ‚ΡŒΡŽ НСйл

#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 World

Waiting 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 now

Other thread finished, bye!

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, установка отсоСдинСнного состояния позволяСт Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ нСзависимо, Π±Π΅Π· нСобходимости исходному ΠΏΠΎΡ‚ΠΎΠΊΡƒ ΠΆΠ΄Π°Ρ‚ΡŒ этого события.

Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

Π’ исходном тСкстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΄Π²Π° Π²Π°ΠΆΠ½Ρ‹Ρ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°:

pthread_attr_t thread_attr;

res = pthread_attr_init(&amp;thread_attr);

if (res != 0) {

Β perror(&quot;Attribute creation failed&quot;);

Β exit(EXIT_FAILURE);

}

ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ, ΠΈ

res = pthread_attr_setdetachstatΠ΅(&amp;thread_attr, PTHREAD_CREATE_DETACHED);

if (res != 0) {

Β perror(&quot;Setting detached attribute failed&quot;);

Β exit(EXIT_FAILURE);

}

ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ устанавливаСт значСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² для задания отсоСдинСнного состояния ΠΏΠΎΡ‚ΠΎΠΊΠ°.

К Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ отличиям относится созданиС ΠΏΠΎΡ‚ΠΎΠΊΠ° с ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ адрСса Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²:

res = pthread_create(&amp;a_thread, &amp;thread_attr, thread_function, (void*)message);

ΠΈ для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎΡΡ‚ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² послС ΠΈΡ… использования:

pthread_attr_destroy(&amp;thread_attr);

Атрибуты планирования ΠΏΠΎΡ‚ΠΎΠΊΠ°

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π°ΠΌ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, захочСтся ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ, β€” Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ планирования. ИзмСнСниС этого Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° установку отсоСдинСнного состояния ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π½ΠΎ Π΅ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ для ΠΏΠΎΠ΄Π±ΠΎΡ€Π° допустимых ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°,

sched_get_priority_max
ΠΈ
sched_get_priority_min
.

Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 12.6.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 12.6. ΠŸΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ данная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° thread6.c ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ упраТнСния, ΠΌΡ‹ рассмотрим Ρ‚ΠΎΠ»ΡŒΠΊΠΎ отличия.

1.Β ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, Π²Π°ΠΌ понадобится нСсколько Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…:

int max_priority;

int min_priority;

struct sched_param scheduling_value;

2. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ установлСн Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ отсоСдинСния, Π²Ρ‹ Π·Π°Π΄Π°Π΅Ρ‚Π΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ планирования:

res = pthread_attr_setschedpolicy(&amp;thread_attr, SCHED_OTHER);

if (res != 0) {

Β perror(&quot;Setting scheduling policy failed&quot;);

Β 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(&amp;thread_attr, &amp;scheduling_value);

if (res != 0) {

Β perror(&quot;Setting scheduling priority failed&quot;);