ΠΡΡΠ³ΠΎΠΉ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΡΠΉ Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ, β ΡΡΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ 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.