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

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

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

Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ для управлСния ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, β€” это ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ flags, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ thread_pool_create(). Он ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:

POOL_FLAG_EXIT_SELF

НС Π΄Π΅Π»Π°Ρ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ thread_pool_start() ΠΈ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π² ΠΏΡƒΠ».

POOL_FLAG_USE_SELF

НС Π΄Π΅Π»Π°Ρ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ thread_pool_start(), Π½ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π² ΠΏΡƒΠ».

0

Ѐункция thread_pool_start() возвратится, Π½ΠΎΠ²Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ описаниС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ суховатым. Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

Π’ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ структурС ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² сконцСнтрируСм нашС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° значСниях ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² lo_water, increment ΠΈ maximum:

/*

 * tp1.с

 *

 * ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с ΠΏΡƒΠ»Π°ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (1)

 *

*/


#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <sys/neutrino.h>

#include <sys/dispatch.h>


char *progname = "tp1";


void tag (char *name) {

 time_t t;

 char buffer[BUFSIZ];

 time(&t);

 strftime(buffer, BUFSIZ, "%T ", localtime(&t));

 printf("%s %3d %-20.20s: ", buffer, pthread_self(), name);

}


THREAD_POOL_PARAM_T* blockfunc(

 THREAD_POOL_PARAM_T *ctp) {

 tag("blockfunc");

 printf("ctp %p\n", ctp);

 tag("blockfunc");

 printf("sleep (%d);\n", 15 * pthread_self());

 sleep(pthread_self() * 15);

 tag("blockfunc");

 printf("Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ sleep\n");

 tag("blockfunc");

 printf("Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ 0x%08X\n",

  0x10000000 + pthread_self());

 return((void*)(0x10000000 + pthread_self()));

 // ΠŸΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ handlerfunc

}


THREAD_POOL_PARAM_T* contextalloc(

 THREAD_POOL_HANDLE_T *handle) {

 tag("contextalloc");

 printf("handle %p\n", handle);

 tag("contextalloc");

 printf("Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ 0x%08X\n",

  0x20000000 + pthread_self());

 return ((void*)(0x20000000 + pthread_self()));

 // ΠŸΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ blockfunc

}


void contextfree(THREAD_POOL_PARAM_T *param) {

 tag("contextfree");

 printf("param %p\n", param);

}


void unblockfunc(THREAD_POOL_PARAM_T *ctp) {

 tag("unblockfunc");

 printf("ctp %p\n", ctp);

}


int handlerfunc(THREAD_POOL_PARAM_T *ctp) {

 static int i = 0;

 tag("handlerfunc");

 printf("ctp %p\n", ctp);

 if (i++ > 15) {

  tag("handlerfunc");

  printf("Π‘ΠΎΠ»Π΅Π΅ 15 ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ 0\n");

  return (0);

 }

 tag("handlerfunc");

 printf("sleep (%d)\n", pthread_self() * 25);

 sleep(pthread_self() * 25);

 tag("handlerfunc");

 printf("Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ sleep\n");

 tag("handlerfunc");

 printf("Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ 0x%08X\n",

  0x30000000 + pthread_self());

 return (0x30000000 + pthread_self());

}


main() {

 thread_pool_attr_t tp_attr;

 void *tpp;

 memset(&tp_attr, 0, sizeof(tp_attr));

 tp_attr.handle = (void*)0x12345678;

  // ΠŸΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ contextalloc

 tp_attr.block_func = blockfunc;

 tp_attr.unblock_func = unblockfunc;

 tp_attr.context_alloc = contextalloc;

 tp_attr.context_free = contextfree;

 tp_attr.handler_func = handlerfunc;

 tp_attr.lo_water = 3;

 tp_attr.hi_water = 7;

 tp_attr.increment = 2;

 tp_attr.maximum = 10;

 if ((tpp =

  thread_pool_create(&tp_attr, POOL_FLAG_USE_SELF)) ==

   NULL) {

  fprintf(stderr,

   "%s: Ошибка thread_pool_create, errno %s\n",

   progname, strerror(errno));

  exit(EXIT_FAILURE);

 }

 thread_pool_start(tpp);

 fprintf(stderr,

  "%s: Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· thread_pool_start; errno %s\n",

  progname, strerror(errno));

 sleep(3000);

 exit(EXIT_FAILURE);

}

ПослС установки ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ thread_pool_create() для создания ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π­Ρ‚Π° функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ структуру ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (tpp), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ провСряСм Π½Π° равСнство NULL (Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Π»ΠΎ Π±Ρ‹ Π½Π° ΠΎΡˆΠΈΠ±ΠΊΡƒ). И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ thread_pool_start(), ΠΏΠ΅Ρ€Π΅Π΄Π°Π² Π΅ΠΉ эту ΡΠ°ΠΌΡƒΡŽ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ структуру tpp.

Π― ΡƒΠΊΠ°Π·Π°Π» Ρ„Π»Π°Π³ POOL_FLAG_USE_SELF, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊ, Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ thread_pool_start(), Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ доступный для Π²Π²ΠΎΠ΄Π° Π² ΠΏΡƒΠ». Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ старта ΠΏΡƒΠ»Π° Π² Π½Π΅ΠΌ Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° lo_water Ρ€Π°Π²Π½ΠΎ 3, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ создаст Π΅Ρ‰Π΅ increment ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (Π² нашСм случаС β€” 2). Π‘ этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π² ΠΏΡƒΠ»Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Ρ€ΠΈ (3) ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΈ всС ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ блокирования. УсловиС ΠΏΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ lo_water ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€Π΅Π½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ блокирования Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ мСньшС lo_water, условиС ΠΏΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ hi_water ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€Π΅Π½ΠΎ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ блокирования Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ большС hi_water; ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€Π΅Π½ΠΎ условиС ΠΏΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ maximum, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‰Π΅Π΅ число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ Π΅Π³ΠΎ значСния. Допустим Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², находящихся Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ блокирования, разблокируСтся (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² сСрвСрном ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ β€” ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ сообщСния). Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅Ρ‚ ΠΈΠ· Ρ€Π΅ΠΆΠΈΠΌΠ° блокирования Π² Ρ€Π΅ΠΆΠΈΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡΡ, ΠΈ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠΏΠ°Π΄Π΅Ρ‚ Π½ΠΈΠΆΠ΅ значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° lo_water. Π­Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ lo_water ΠΈ заставит Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ increment (2) ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ всСго 5 ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (4 Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ блокирования, ΠΈ 1 β€” Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ).

ΠŸΡƒΡΡ‚ΡŒ Π΄Π°Π»Π΅Π΅ разблокируСтся Π΅Ρ‰Π΅ нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π½Π° этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΅Ρ‰Π΅ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², находящихся Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Π΅Ρ‰Π΅ Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ» свои Π΄Π΅Π»Π°. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ вСсь процСсс, начиная с исходного состояния:

Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ Π Π΅ΠΆΠΈΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π Π΅ΠΆΠΈΠΌ блокирования ВсСго ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π˜ΡΡ…ΠΎΠ΄Π½ΠΎΠ΅ состояниС 0 1 1 Π‘Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π° lo_water 0 3 3 Π Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ 1 2 3 Π‘Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π° lo_water 1 4 5 Π Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ 2 3 5 Π Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ 3 2 5 Π‘Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π° lo_water 3 4 7 Π Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ 4 3 7 Π Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ 5 2 7 Π‘Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π° lo_water 5 4 9 Π Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ 6 3 9 Π Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ 7 2 9 Π‘Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π° lo_water 7 3 10 Π Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ 8 2 10 Π Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ 9 1 10 Π Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ 10 0 10

Π’ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° провСряСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ lo_water, ΠΈ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ нСобходимости ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° increment, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° число ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π½Π΅ достигнСт ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния β€” ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° maximum (ΠΈΠΌΠ΅Π½Π½ΠΎ поэтому число Π² столбцС «ВсСго ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Β» Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ 10, Π΄Π°ΠΆΠ΅ ΠΊΠΎΠ³Π΄Π° условиС ΠΏΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ lo_water пСрСстаСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ).

Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹ наступаСт ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ блокирования большС Π½Π΅ остаСтся. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, находящиСся Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‚ свои Π΄Π΅Π»Π°. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ этом ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ с Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ΠΎΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° hi_water.