ΠΠ΄Π½Π° ΠΈΠ· ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΡ Π·Π°Π΄Π°Ρ Π½Π° ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ Π·Π°Π΄Π°ΡΠ΅ΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ. ΠΠ½Π° ΡΠ°ΠΊΠΆΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ½Π° ΠΊΠ°ΠΊ Π·Π°Π΄Π°ΡΠ° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΠΎΠ³ΠΎ Π±ΡΡΠ΅ΡΠ°. ΠΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ (ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΈΠ»ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²) ΡΠΎΠ·Π΄Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΌΠΈ. ΠΡΠΈ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠΌΠΈ ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΌΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΠΎΡΠΌ IPC.
Π‘ ΡΡΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ ΠΌΡ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎ ΡΡΠ°Π»ΠΊΠΈΠ²Π°Π΅ΠΌΡΡ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠ°Π½Π°Π»ΠΎΠ² Unix. ΠΠΎΠΌΠ°Π½Π΄Π° ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ°Ρ ΠΊΠ°Π½Π°Π»
grep pattern chapters.* | wc -l
ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ ΡΠ°ΠΊΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° grep Π²ΡΡΡΡΠΏΠ°Π΅Ρ ΠΊΠ°ΠΊ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ (Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ), a wc β ΠΊΠ°ΠΊ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ (ΡΠΎΠΆΠ΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ). ΠΠ°Π½Π°Π» ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ ΡΠΎΡΠΌΠ° IPC. Π’ΡΠ΅Π±ΡΠ΅ΠΌΠ°Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΌ ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΌ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΡΡΡ ΡΠ΄ΡΠΎΠΌ, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΠΈΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ write ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΠΈ read ΠΏΠΎΠΊΡΠΏΠ°ΡΠ΅Π»Ρ. ΠΡΠ»ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΠΎΠΏΠ΅ΡΠ΅ΠΆΠ°Π΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ (ΠΊΠ°Π½Π°Π» ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ), ΡΠ΄ΡΠΎ ΠΏΡΠΈΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ write, ΠΏΠΎΠΊΠ° Π² ΠΊΠ°Π½Π°Π»Π΅ Π½Π΅ ΠΏΠΎΡΠ²ΠΈΡΡΡ ΠΌΠ΅ΡΡΠΎ. ΠΡΠ»ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΠΎΠΏΠ΅ΡΠ΅ΠΆΠ°Π΅Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ (ΠΊΠ°Π½Π°Π» ΠΎΠΏΡΡΡΠΎΡΠ°Π΅ΡΡΡ), ΡΠ΄ΡΠΎ ΠΏΡΠΈΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ read, ΠΏΠΎΠΊΠ° Π² ΠΊΠ°Π½Π°Π»Π΅ Π½Π΅ ΠΏΠΎΡΠ²ΡΡΡΡ Π΄Π°Π½Π½ΡΠ΅.
Π’Π°ΠΊΠΎΠΉ ΡΠΈΠΏ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ Π½Π΅ΡΠ²Π½ΡΠΌ; ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ Π½Π΅ Π·Π½Π°ΡΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ Π²ΠΎΠΎΠ±ΡΠ΅ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ. ΠΡΠ»ΠΈ Π±Ρ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Posix ΠΈΠ»ΠΈ System V Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΡΠ΅Π΄ΡΡΠ²Π° IPC ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΌ ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΌ, ΡΠ΄ΡΠΎ ΡΠ½ΠΎΠ²Π° Π²Π·ΡΠ»ΠΎ Π±Ρ Π½Π° ΡΠ΅Π±Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ.
ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ ΠΊΠ°ΠΊ ΡΡΠ΅Π΄ΡΡΠ²Π° IPC ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ Π²ΠΈΠ΄Π° ΡΠ²Π½ΠΎΠΉ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ. ΠΡ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅ΠΌ ΡΡΠΎ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ. Π‘Ρ Π΅ΠΌΠ° ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π° Π½Π° ΡΠΈΡ. 7.1.
Π ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ΅ Ρ Π½Π°Ρ ΠΈΠΌΠ΅Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ²-ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ-ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ. Π¦Π΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² buff ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΈ ΠΏΠΎΡΡΠ΅Π±Π»ΡΠ΅ΠΌΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ (Π΄Π°Π½Π½ΡΠ΅ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ). ΠΠ»Ρ ΠΏΡΠΎΡΡΠΎΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΠΈ ΠΏΡΠΎΡΡΠΎ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ buff[0] Π² 0, buff [1] Π² 1 ΠΈ Ρ.Π΄. ΠΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΠΏΠ΅ΡΠ΅Π±ΠΈΡΠ°Π΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΌΠ°ΡΡΠΈΠ²Π°, ΠΏΡΠΎΠ²Π΅ΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΡΡΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ.
Π ΡΡΠΎΠΌ ΠΏΠ΅ΡΠ²ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ ΠΊΠΎΠ½ΡΠ΅Π½ΡΡΠΈΡΡΠ΅ΠΌ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ-ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠΌΠΈ. ΠΠΎΡΠΎΠΊ-ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΡΡΠ΅Π½, ΠΏΠΎΠΊΠ° Π²ΡΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΠΈ Π½Π΅ Π·Π°Π²Π΅ΡΡΠ°Ρ ΡΠ²ΠΎΡ ΡΠ°Π±ΠΎΡΡ. Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 7.1 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° ΡΡΠ½ΠΊΡΠΈΡ main Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°.
Π ΠΈΡ. 7.1. ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΠΈ ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ
//mutex/prodcons2.Ρ
1 #include "unpipc.h"
2 #define MAXNITEMS 1000000
3 #define MAXNTHREADS 100
4 int nitems; /* ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΌ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΌ */
5 struct {
6 pthread_mutex_t mutex;
7 int buff[MAXNITEMS];
8 int nput;
9 int nval;
10 } shared = {
11 PTHREAD_MUTEX_INITIALIZER
12 };
13 void *produce(void *), *consume(void *);
14 int
15 main(int argc, char **argv)
16 {
17 int i, nthreads, count[MAXNTHREADS];
18 pthread_t tid_produce[MAXNTHREADS], tid_consume;
19 if (argc != 3)
20 err_quit("usage: prodcons2 <#items> <#threads>");
21 nitems = min(atoi(argv[1]), MAXNITEMS);
22 nthreads = min(atoi(argv[2]), MAXNTHREADS);
23 Set_concurrency(nthreads);
24 /* Π·Π°ΠΏΡΡΠΊ Π²ΡΠ΅Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ²-ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ */
25 for (i = 0; i < nthreads; i++) {
26 count[i] = 0;
27 Pthread_create(&tid_produce[i], NULL, produce, &count[i]);
28 }
29 /* ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠ΅Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ */
30 for (i = 0; i < nthreads; i++) {
31 Pthread_join(tid_produce[i], NULL);
32 printf("count[%d] = %d\n", i, count[i]);
33 }
34 /* Π·Π°ΠΏΡΡΠΊ ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°-ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ */
35 Pthread_create(&tid_consume, NULL, consume, NULL);
36 Pthread_join(tid_consume, NULL);
37 exit(0);
38 }
Π‘ΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ4-12 ΠΡΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ. ΠΡ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅ΠΌ ΠΈΡ Π² ΡΡΡΡΠΊΡΡΡΡ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ shared Π²ΠΌΠ΅ΡΡΠ΅ Ρ Π²Π·Π°ΠΈΠΌΠ½ΡΠΌ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ΄ΡΠ΅ΡΠΊΠ½ΡΡΡ, ΡΡΠΎ Π΄ΠΎΡΡΡΠΏ ΠΊ Π½ΠΈΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π²ΠΌΠ΅ΡΡΠ΅ Ρ Π½ΠΈΠΌ. ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ nput Ρ ΡΠ°Π½ΠΈΡ ΠΈΠ½Π΄Π΅ΠΊΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΌΠ°ΡΡΠΈΠ²Π° buff, ΠΏΠΎΠ΄Π»Π΅ΠΆΠ°ΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅, a nval ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Π² Π½Π΅Π³ΠΎ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ΠΎ (0, 1, 2 ΠΈ Ρ.Π΄.). ΠΡ Π²ΡΠ΄Π΅Π»ΡΠ΅ΠΌ ΠΏΠ°ΠΌΡΡΡ ΠΏΠΎΠ΄ ΡΡΡ ΡΡΡΡΠΊΡΡΡΡ ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ΅ Π΄Π»Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ²-ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ.
ΠΠ ΠΠΠΠ§ΠΠΠΠ
ΠΡ Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ΄Π΅ΠΌ ΡΡΠ°ΡΠ°ΡΡΡΡ ΡΠ°Π·ΠΌΠ΅ΡΠ°ΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π²ΠΌΠ΅ΡΡΠ΅ ΡΠΎ ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ, ΠΊ Π½ΠΈΠΌ ΠΎΡΠ½ΠΎΡΡΡΠΈΠΌΠΈΡΡ (Π²Π·Π°ΠΈΠΌΠ½ΡΠΌΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡΠΌΠΈ, ΡΡΠ»ΠΎΠ²Π½ΡΠΌΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌΠΈ, ΡΠ΅ΠΌΠ°ΡΠΎΡΠ°ΠΌΠΈ), Π² ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΠ΅, ΠΊΠ°ΠΊ ΠΌΡ ΡΠ΄Π΅Π»Π°Π»ΠΈ Π² ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅. ΠΡΠΎ Ρ ΠΎΡΠΎΡΠΈΠΉ ΡΡΠΈΠ»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠ΄Π½Π°ΠΊΠΎ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ ΡΠ»ΡΡΠ°ΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΡΠ²Π»ΡΡΡΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡ ΡΠΎΠ±ΠΎΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ²ΡΠ·Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ. ΠΡ, Π½Π°Π²Π΅ΡΠ½ΠΎΠ΅, ΡΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ Π² ΡΡΡΡΠΊΡΡΡΡ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠΏΠΈΡΠΊΠ° Π²ΠΌΠ΅ΡΡΠ΅ ΡΠΎ ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ (ΠΊΠ°ΠΊ Π² ΡΡΡΡΠΊΡΡΡΠ΅ mq_hdr Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 5.16), Π½ΠΎ ΠΎΡΡΠ°Π²ΡΠ°ΡΡΡ ΡΠ°ΡΡΡ ΡΠΏΠΈΡΠΊΠ° Π² ΡΡΡΡΠΊΡΡΡΡ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π΅Ρ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΡΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΠ΄Π΅Π°Π»ΡΠ½ΡΠΌ.
ΠΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ19-22 ΠΠ΅ΡΠ²ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠΌΠΈ, Π° Π²ΡΠΎΡΠΎΠΉ β ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ²-ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΡΠΎΠ²Π½Ρ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΡΡΠΈ23 Π€ΡΠ½ΠΊΡΠΈΡ set_concurrency (Π½Π°ΡΠ° ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½Π°Ρ) ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ². Π Solaris 2.6 ΠΎΠ½Π° ΠΏΡΠΎΡΡΠΎ Π²ΡΠ·ΡΠ²Π°Π΅Ρ thr_setconcurrency, ΠΏΡΠΈΡΠ΅ΠΌ Π΅Π΅ Π·Π°ΠΏΡΡΠΊ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ, Π΅ΡΠ»ΠΈ ΠΌΡ Ρ ΠΎΡΠΈΠΌ, ΡΡΠΎΠ±Ρ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²-ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ Π±ΡΠ»Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π½Π°ΡΠ°ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ. ΠΡΠ»ΠΈ ΠΌΡ Π½Π΅ ΡΠ΄Π΅Π»Π°Π΅ΠΌ ΡΡΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ Solaris, Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΡΡΠ΅Π½ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΠΎΡΠΎΠΊ. Π Digital Unix 4.0B Π½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ set_concurrency Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ Π½ΠΈΡΠ΅Π³ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π² ΡΡΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π²ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΈΠΌΠ΅ΡΡ ΡΠ°Π²Π½ΡΠ΅ ΠΏΡΠ°Π²Π° Π½Π° Π²ΡΡΠΈΡΠ»ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠ΅ΡΡΡΡΡ.
ΠΠ ΠΠΠΠ§ΠΠΠΠ
Unix 98 ΡΡΠ΅Π±ΡΠ΅Ρ Π½Π°Π»ΠΈΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ pthread_setconcurrency, Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠ΅ΠΉ ΡΡΠΎ ΠΆΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅. ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡΠ»ΡΡΠΈΠΏΠ»Π΅ΠΊΡΠΈΡΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ (ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ pthread_create) Π½Π° Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΡΠ΄ΡΠ°. Π’Π°ΠΊΠΈΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°ΡΡΠΎ Π½Π°Π·ΡΠ²Π°ΡΡΡΡ Β«ΠΌΠ½ΠΎΠ³ΠΈΠ΅-ΠΊ-Π½Π΅ΠΌΠ½ΠΎΠ³ΠΈΠΌΒ» (many-to-few), Β«Π΄Π²ΡΡ ΡΡΠΎΠ²Π½Π΅Π²ΡΠ΅Β» (two-level) ΠΈΠ»ΠΈ Β«Π-Π½Π°-NΒ» (M-to-N). Π ΡΠ°Π·Π΄Π΅Π»Π΅ 5.6 ΠΊΠ½ΠΈΠ³ΠΈ [3] ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ ΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ ΡΠ΄ΡΠ° ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ.
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²-ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ24-28 Π‘ΠΎΠ·Π΄Π°ΡΡΡΡ ΠΏΠΎΡΠΎΠΊΠΈ-ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΠΈ, ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ produce. ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² Ρ ΡΠ°Π½ΡΡΡΡ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ tid_produce. ΠΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°-ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΌΠ°ΡΡΠΈΠ²Π° count. Π‘ΡΠ΅ΡΡΠΈΠΊΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΡΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ 0, ΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΠΎΡΠΎΠΊ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ²ΠΎΠ΅Π³ΠΎ ΡΡΠ΅ΡΡΠΈΠΊΠ° Π½Π° 1 ΠΏΡΠΈ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ΠΈΠΈ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π² Π±ΡΡΠ΅Ρ. Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΌΠ°ΡΡΠΈΠ²Π° ΡΡΠ΅ΡΡΠΈΠΊΠΎΠ² Π·Π°ΡΠ΅ΠΌ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡ Π½Π° ΡΠΊΡΠ°Π½, ΡΠ°ΠΊ ΡΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ·Π½Π°ΡΡ, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π±ΡΠ»ΠΎ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ΠΎ Π² Π±ΡΡΠ΅Ρ ΠΊΠ°ΠΆΠ΄ΡΠΌ ΠΈΠ· ΠΏΠΎΡΠΎΠΊΠΎΠ².
ΠΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ, Π·Π°ΠΏΡΡΠΊ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ29-36 ΠΡ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ Π²ΡΠ΅Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ²-ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ, Π²ΡΠ²ΠΎΠ΄Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΡΠ΅ΡΡΠΈΠΊΠ° Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°, Π° Π·Π°ΡΠ΅ΠΌ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ-ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ (Π½Π° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ) ΠΌΡ ΠΈΡΠΊΠ»ΡΡΠ°Π΅ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΌ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠΌΠΈ. ΠΡ ΠΆΠ΄Π΅ΠΌ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ, Π° Π·Π°ΡΠ΅ΠΌ Π·Π°Π²Π΅ΡΡΠ°Π΅ΠΌ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°. Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 7.2 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ produce ΠΈ consume.
ΠΠΈΡΡΠΈΠ½Π³ 7.2. Π€ΡΠ½ΠΊΡΠΈΠΈ produce ΠΈ consume//mutex/prodcons2.Ρ
39 void *
40 produce(void *arg)
41 {
42 for (;;) {
43 Pthread_mutex_lock(&shared.mutex);
44 if (shared.nput >= nitems) {
45 Pthread_mutex_unlock(&shared.mutex);
46 return(NULL); /* ΠΌΠ°ΡΡΠΈΠ² ΠΏΠΎΠ»Π½ΡΠΉ, Π³ΠΎΡΠΎΠ²ΠΎ */
47 }
48 shared.buff[shared.nput] = shared.nval;
49 shared.nput++;
50 shared.nval++;
51 Pthread_mutex_unlock(&shared.mutex);
52 *((int *) arg) += 1;
53 }
54 }
55 void *
56 consume(void *arg)
57 {
58 int i;
59 for (i = 0; i < nitems; i++) {
60 if (shared.buff[i] != i)
61 printf("buff[%d] = %d\n", i, shared.buff[i]);
62 }
63 return(NULL);
64 }
Π€ΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ42-53 ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΎΠ±Π»Π°ΡΡΡ ΠΊΠΎΠ΄Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π½Π° Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ° ΠΌΠ°ΡΡΠΈΠ²Π° (Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΡ)
if (shared.nput >= nitems)
ΠΈ ΡΡΠ΅Ρ ΡΡΡΠΎΠΊ, ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡΠΈΡ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΠΌΠ°ΡΡΠΈΠ²:
shared.buff[shared.nput] = shared.nval;
shared.nput++;
shared.nval++;
ΠΡ Π·Π°ΡΠΈΡΠ°Π΅ΠΌ ΡΡΡ ΠΎΠ±Π»Π°ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, Π½Π΅ Π·Π°Π±ΡΠ² ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ ΠΏΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° count (ΡΠ΅ΡΠ΅Π· ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ arg) Π½Π΅ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° ΡΡΠ΅ΡΡΠΈΠΊ ΡΠ²ΠΎΠΉ (ΠΌΠ°ΡΡΠΈΠ² count Π² ΡΡΠ½ΠΊΡΠΈΠΈ main). ΠΠΎΡΡΠΎΠΌΡ ΠΌΡ Π½Π΅ Π²ΠΊΠ»ΡΡΠ°Π΅ΠΌ ΡΡΡ ΡΡΡΠΎΠΊΡ Π² Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌΡΡ Π²Π·Π°ΠΈΠΌΠ½ΡΠΌ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±Π»Π°ΡΡΡ. ΠΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡΠΈΠ½ΡΠΈΠΏΠΎΠ² Ρ ΠΎΡΠΎΡΠ΅Π³ΠΎ ΡΡΠΈΠ»Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΌΠ° ΠΊΠΎΠ΄Π°, Π·Π°ΡΠΈΡΠ°Π΅ΠΌΠΎΠ³ΠΎ Π²Π·Π°ΠΈΠΌΠ½ΡΠΌ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ.