74 return(NULL);
75 }
Π£ΡΠ»ΠΎΠ²ΠΈΠ΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°-ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ Π·Π²ΡΡΠΈΡ ΠΏΡΠΎΡΡΠΎ: ΠΎΠ½ ΡΡΠΈΡΠ°Π΅Ρ Π²ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½Π½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΈ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΠΎ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΠΈ nitems.
10.10. ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ, Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΉ
Π‘Π»Π΅Π΄ΡΡΡΠ΅Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΡ Π²Π½Π΅ΡΠ΅ΠΌ Π² Π½Π°ΡΡ ΠΏpoΠ³ΡaΠΌΠΌy, Π±ΡΠ΄Π΅Ρ Π·Π°ΠΊΠ»ΡΡΠ°ΡΡΡΡ Π² Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΉ Π²ΠΌΠ΅ΡΡΠ΅ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠΌΠΈ. ΠΡΡΡ Π»ΠΈ ΡΠΌΡΡΠ» Π² Π½Π°Π»ΠΈΡΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΉ β Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ²ΡΠΎΡ Π²ΠΈΠ΄Π΅Π» Π΄Π²Π° ΠΏΡΠΈΠΌΠ΅ΡΠ°, Π² ΠΊΠΎΡΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΡΡ ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄.
1. ΠpoΠ³ΡaΠΌΠΌa ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ IP-Π°Π΄ΡΠ΅ΡΠΎΠ² Π² ΠΈΠΌΠ΅Π½Π° ΡΠ·Π»ΠΎΠ². ΠΠ°ΠΆΠ΄ΡΠΉ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ Π±Π΅ΡΠ΅Ρ IP-Π°Π΄ΡΠ΅Ρ, Π²ΡΠ·ΡΠ²Π°Π΅Ρ gethostbyaddr (ΡΠ°Π·Π΄Π΅Π» 9.6 [24]), Π·Π°ΡΠ΅ΠΌ Π΄ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ ΠΈΠΌΡ ΡΠ·Π»Π° ΠΊ ΡΠ°ΠΉΠ»Ρ. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π²ΡΠ·ΠΎΠ² gethostbyaddr ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΡΡ Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ, ΠΏΠΎΡΡΠ΄ΠΎΠΊ IP-Π°Π΄ΡΠ΅ΡΠΎΠ² Π² Π±ΡΡΠ΅ΡΠ΅ Π±ΡΠ΄Π΅Ρ, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ, ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ ΠΎΡ ΠΏΠΎΡΡΠ΄ΠΊΠ° ΠΈΠΌΠ΅Π½ ΡΠ·Π»ΠΎΠ² Π² ΡΠ°ΠΉΠ»Π΅, ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ-ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΌΠΈ. ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ ΡΡΠΎΠΉ ΡΡ Π΅ΠΌΡ Π² ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΡΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ² gethostbyaddr (ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΠΊΡΠ½Π΄) β ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΏΠΎΡΠΎΠΊ-ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ.
ΠΠ ΠΠΠΠ§ΠΠΠΠ
ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ Π½Π°Π»ΠΈΡΠΈΠ΅ Π²Π΅ΡΡΠΈΠΈ gethostbyaddr, Π΄ΠΎΠΏΡΡΠΊΠ°ΡΡΠ΅ΠΉ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΎΠ΅ Π²Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅, ΡΡΠΎ Π½Π΅ Π²ΡΠ΅Π³Π΄Π° Π²Π΅ΡΠ½ΠΎ. ΠΡΠ»ΠΈ ΡΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½Π°, ΠΌΠΎΠΆΠ½ΠΎ Ρ ΡΠ°Π½ΠΈΡΡ Π±ΡΡΠ΅Ρ Π² ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΡ Π²ΠΌΠ΅ΡΡΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ².
2. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠ°Ρ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ UDP, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΠ°Ρ ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΠ°Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π² Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ . ΠΠ°ΠΆΠ΄Π°Ρ Π΄eΠΉΡaΠ³ΡaΠΌΠΌa ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ-ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ Π΄Π»Ρ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°. Π₯ΠΎΡΡ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΡ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π² Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅, Π²ΠΎΠΎΠ±ΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ, ΠΎΡΠ»ΠΈΡΠ½ΠΎΠΌ ΠΎΡ ΠΏΠΎΡΡΠ΄ΠΊΠ° ΠΈΡ ΠΏΡΠΈΠ΅ΠΌΠ°, Π²ΡΡΡΠΎΠ΅Π½Π½Π°Ρ ΡΡ Π΅ΠΌΠ° ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½ΠΈΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ ΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ Ρ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ.
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 10.15 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Ρ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
ΠΠΈΡΡΠΈΠ½Π³ 10.15. ΠΠ»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅//pxsem/prodcons4.Ρ
1 #include "unpipc.h"
2 #define NBUFF 10
3 #define MAXNTHREADS 100
4 int nitems, nproducers, nconsumers; /* ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ */
5 struct { /* ΠΎΠ±ΡΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΉ */
6 int buff[NBUFF];
7 int nput; /* Π½ΠΎΠΌΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°: 0, 1. 2, β¦ */
8 int nputval; /* ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌΠΎΠ΅ Π² buff[] Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ */
9 int nget; /* Π½ΠΎΠΌΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°: 0, 1, 2, β¦ */
10 int ngetval; /* ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌΠΎΠ΅ ΠΈΠ· buff[] Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ */
11 sem_t mutex, nempty, nstored; /* ΡΠ΅ΠΌΠ°ΡΠΎΡΡ, Π° Π½Π΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ */
12 } shared;
13 void *produce(void *), *consume(void *);
ΠΠ»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΈ ΠΎΠ±ΡΠ°Ρ ΡΡΡΡΠΊΡΡΡΠ°4-12 ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ²-ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌΠΎΠΉ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ. Π ΡΡΡΡΠΊΡΡΡΡ shared Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΎΡΡ Π΄Π²Π° Π½ΠΎΠ²ΡΡ ΠΏΠΎΠ»Ρ: nget β Π½ΠΎΠΌΠ΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌΠΎΠ³ΠΎ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΏΠΎΡΠΎΠΊΠΎΠ²-ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΉ, ΠΈ ngetval β ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
Π€ΡΠ½ΠΊΡΠΈΡ main, ΡΠ΅ΠΊΡΡ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 10.16, Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ²-ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΉ ΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ²-ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ.
19-23 ΠΠΎΠ²ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ²-ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΉ. ΠΠ»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ² ΠΏΠΎΡΠΎΠΊΠΎΠ²-ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΉ Π²ΡΠ΄Π΅Π»ΡΠ΅ΡΡΡ ΠΌΠ΅ΡΡΠΎ ΠΏΠΎΠ΄ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² (tid_consume), Π° Π΄Π»Ρ ΠΏΠΎΠ΄ΡΡΠ΅ΡΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π²ΡΠ΄Π΅Π»ΡΠ΅ΡΡΡ ΠΌΠ°ΡΡΠΈΠ² conscount.
24-50 Π‘ΠΎΠ·Π΄Π°ΡΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ²-ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΉ, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ ΠΆΠ΄Π΅Ρ ΠΈΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ.
ΠΠΈΡΡΠΈΠ½Π³ 10.16. Π€ΡΠ½ΠΊΡΠΈΡ main Π΄Π»Ρ Π²Π΅ΡΡΠΈΠΈ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠΌΠΈ ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΌΠΈ//pxsem/prodcons4.Ρ
14 int
15 main(int argc, char **argv)
16 {
17 int i, prodcount[MAXNTHREADS], conscount[MAXNTHREADS];
18 pthread_t tid_produce[MAXNTHREADS], tid_consume[MAXNTHREADS];
19 if (argc != 4)
20 err_quit("usage: prodcons4 <#items> <#producers> <#consumers>");
21 nitems = atoi(argv[1]);
22 nproducers = min(atoi(argv[2]), MAXNTHREADS);
23 nconsumers = min(atoi(argv[3]), MAXNTHREADS);
24 /* ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠ΅Ρ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² */
25 Sem_init(&shared.mutex, 0, 1);
26 Sem_init(&shared.nempty, 0, NBUFF);
27 Sem_init(&shared.nstored, 0, 0);
28 /* ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΉ */
29 Set_concurrency(nproducers + nconsumers);
30 for (i = 0; i < nproducers; i++) {
31 prodcount[i] = 0;
32 Pthread_create(&tid_produce[i], NULL, produce, &prodcount[i]);
33 }
34 for (i = 0; i < nconsumers; i++) {
35 conscount[i] = 0;
36 Pthread_create(&tid_consume[i], NULL, consume, &conscount[i]);
37 }
38 /* ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠ΅Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΉ */
39 for (i = 0; i < nproducers: i++) {
40 Pthread_join(tid_produce[i], NULL);
41 printf("producer count[%d] = %d\n", i, prodcount[i]);
42 }
43 for (i = 0; i < nconsumers; i++) {
44 Pthread_join(tid_consume[i], NULL);
45 printf("consumer count[%d] = %d\n", i, conscount[i]);
46 }
47 Sem_destroy(&shared.mutex);
48 Sem_destroy(&shared.nempty);
49 Sem_destroy(&shared.nstored);
50 exit(0);
51 }
Π€ΡΠ½ΠΊΡΠΈΡ produce ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΎΠ΄Π½Ρ Π½ΠΎΠ²ΡΡ ΡΡΡΠΎΠΊΡ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ Π»ΠΈΡΡΠΈΠ½Π³ΠΎΠΌ 10.13. Π ΡΠ°ΡΡΠΈ ΠΊΠΎΠ΄Π°, ΠΎΡΠ½ΠΎΡΡΡΠ΅ΠΉΡΡ ΠΊ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°-ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ, ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΡΠΎΠΊΠ°, ΠΎΡΠΌΠ΅ΡΠ΅Π½Π½Π°Ρ Π·Π½Π°ΠΊΠΎΠΌ +:
if (shared.nput >= nitems) {
+ Sem_post(&shared.nstored); /* Π΄Π°Π΅ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΌ Π·Π°Π²Π΅ΡΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ */
Sem_post(&shared.nempty);
Sem_post(&shared.mutex);
return(NULL); /* Π³ΠΎΡΠΎΠ²ΠΎ */
}
Π‘Π½ΠΎΠ²Π° Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π±ΡΡΡ Π°ΠΊΠΊΡΡΠ°ΡΠ½ΡΠΌΠΈ ΠΏΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²-ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΉ. ΠΠΎΡΠ»Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π²ΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π² Π±ΡΡΠ΅ΡΠ΅ Π²ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ Π±Π»ΠΎΠΊΠΈΡΡΡΡΡΡ Π² Π²ΡΠ·ΠΎΠ²Π΅
Sem_wait(&shared.nstored); /* ΠΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π² Π±ΡΡΠ΅Ρ */
ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠΌ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡ nstored Π΄Π»Ρ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΡΡeΠ±ΠΈΡeΠ»eΠΉ, ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΈ ΡΠ·Π½Π°Π»ΠΈ, ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ° Π·Π°Π²Π΅ΡΡΠ΅Π½Π°. Π€ΡΠ½ΠΊΡΠΈΡ consume ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 10.17.
ΠΠΈΡΡΠΈΠ½Π³ 10.17. Π€ΡΠ½ΠΊΡΠΈΡ, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠ°Ρ Π²ΡΠ΅ΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ-ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΌΠΈ//pxsem/prodcons4.c
72 void *
73 consume(void *arg)
74 {
75 int i;
76 for (;;) {
77 Sem_wait(&shared.nstored); /* ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π² Π±ΡΡΠ΅Ρ */
78 Sem_wait(&shared.mutex);
79 if (shared.nget >= nitems) {
80 Sem_post(&shared.nstored);
81 Sem_post(&shared.mutex);
82 return(NULL); /* Π³ΠΎΡΠΎΠ²ΠΎ */
83 }
84 i = shared.nget % NBUFF;
85 if (shared.buff[i] != shared.ngetval)
86 printf("error: buff[%d] = %d\n", i, shared.buff[i]);
87 shared.nget++;
88 shared.ngetval++;
89 Sem_post(&shared.mutex);
90 Sem_post(&shared.nempty); /* ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅ΡΡΡ ΠΌΠ΅ΡΡΠΎ Π΄Π»Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° */
91 *((int *) arg) += 1;
92 }
93 }
ΠΠ°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠ²-ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΉ79-83 Π€ΡΠ½ΠΊΡΠΈΡ consume ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ nget ΠΈ nitems, ΡΡΠΎΠ±Ρ ΡΠ·Π½Π°ΡΡ, ΠΊΠΎΠ³Π΄Π° ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡΡ (Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ produce). ΠΠ±ΡΠ°Π±ΠΎΡΠ°Π² ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Π² Π±ΡΡΠ΅ΡΠ΅, ΠΏΠΎΡΠΎΠΊΠΈ-ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ Π±Π»ΠΎΠΊΠΈΡΡΡΡΡΡ, ΠΎΠΆΠΈΠ΄Π°Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° nstored. ΠΠΎΠ³Π΄Π° Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ-ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ, ΠΎΠ½ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ ΡΠ΅ΠΌΠ°ΡΠΎΡ nstored, Π΄Π°Π²Π°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π·Π°Π²Π΅ΡΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ Π΄ΡΡΠ³ΠΎΠΌΡ ΠΏΠΎΡΠΎΠΊΡ-ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ.
10.11. ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π±ΡΡΠ΅ΡΠΎΠ²
ΠΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ , ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΠΈΡ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Π΄Π°Π½Π½ΡΠ΅, ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡΡΠ΅ΡΠΈΡΡ ΡΠΈΠΊΠ» Π²ΠΈΠ΄Π°
while ((n = read(fdin, buff, BUFFSIZE)) > 0) {
/* ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π΄Π°Π½Π½ΡΡ */
write(fdout, buff, n);
}
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΠΈΠ΅ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠ΅ ΡΠ°ΠΉΠ»Ρ, ΡΡΠΈΡΡΠ²Π°ΡΡ ΡΡΡΠΎΠΊΡ ΠΈΠ· Π²Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°, Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Ρ Π½Π΅ΠΉ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ, Π° Π·Π°ΡΠ΅ΠΌ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ ΡΡΡΠΎΠΊΡ Π² Π²ΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ°ΠΉΠ». ΠΠ»Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² Π²ΡΠ·ΠΎΠ²Ρ read ΠΈ write ΡΠ°ΡΡΠΎ Π·Π°ΠΌΠ΅Π½ΡΡΡΡΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π²Π²ΠΎΠ΄Π°-Π²ΡΠ²ΠΎΠ΄Π° fgets ΠΈ fputs.
ΠΠ° ΡΠΈΡ. 10.11 ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π° ΠΈΠ»Π»ΡΡΡΡΠ°ΡΠΈΡ ΠΊ ΡΠ°ΠΊΠΎΠΉ ΡΡ Π΅ΠΌΠ΅. ΠΠ΄Π΅ΡΡ ΡΡΠ½ΠΊΡΠΈΡ reader ΡΡΠΈΡΡΠ²Π°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· Π²Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°, Π° ΡΡΠ½ΠΊΡΠΈΡ writer Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ Π² Π²ΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ°ΠΉΠ». ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ Π±ΡΡΠ΅Ρ.
Π ΠΈΡ. 10.10. ΠΡΠΎΡΠ΅ΡΡ ΡΡΠΈΡΡΠ²Π°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ Π² Π±ΡΡΠ΅Ρ, Π° ΠΏΠΎΡΠΎΠΌ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π΅Π³ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Π² Π΄ΡΡΠ³ΠΎΠΉ ΡΠ°ΠΉΠ»
Π ΠΈΡ. 10.11. ΠΠ΄ΠΈΠ½ ΠΏΡΠΎΡΠ΅ΡΡ, ΡΡΠΈΡΡΠ²Π°ΡΡΠΈΠΉ Π΄Π°Π½Π½ΡΠ΅ Π² Π±ΡΡΠ΅Ρ ΠΈ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΠΈΠΉ ΠΈΡ Π² ΡΠ°ΠΉΠ»
ΠΠ° ΡΠΈΡ. 10.10 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π²ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΠ° ΡΠ°Π±ΠΎΡΡ ΡΠ°ΠΊΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. Π§ΠΈΡΠ»Π° ΡΠ»Π΅Π²Π° ΠΏΡΠΎΡΡΠ°Π²Π»Π΅Π½Ρ Π² ΡΡΠ»ΠΎΠ²Π½ΡΡ Π΅Π΄ΠΈΠ½ΠΈΡΠ°Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ, ΡΡΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΡΡΠ΅Π½ΠΈΡ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ 5 Π΅Π΄ΠΈΠ½ΠΈΡ, Π·Π°ΠΏΠΈΡΠΈ β 7, Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π΄Π°Π½Π½ΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ Π·Π°ΠΏΠΈΡΡΡ ΡΡΠ΅Π±ΡΠ΅Ρ 2 Π΅Π΄ΠΈΠ½ΠΈΡΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
ΠΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΡΠ°Π·Π΄Π΅Π»ΠΈΠ² ΠΏΡΠΎΡΠ΅ΡΡ Π½Π° ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΡΠΈΡ. 10.12. ΠΠ΄Π΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π²Π° ΠΏΠΎΡΠΎΠΊΠ° (Π° Π½Π΅ ΠΏΡΠΎΡΠ΅ΡΡΠ°), ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠΉ Π±ΡΡΠ΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π½ΠΈΠΌΠΈ. ΠΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π½Π° Π΄Π²Π° ΠΏΡΠΎΡΠ΅ΡΡΠ°, Π½ΠΎ ΡΡΠΎ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°Π»ΠΎ Π±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ, Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΡ Π΅ΡΠ΅ Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌΡ.
Π ΠΈΡ. 10.12. Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»Π° ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²ΡΠΌΡ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ
Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ (ΠΈΠ»ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ) ΡΡΠ΅Π±ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΡΠΎΡΠΌΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ Π½ΠΈΠΌΠΈ. Π‘ΡΠΈΡΡΠ²Π°ΡΡΠΈΠΉ ΠΏΠΎΡΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡΡ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΠΈΠΉ ΠΎ Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ Π±ΡΡΠ΅ΡΠ° ΠΊ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π°ΠΏΠΈΡΠΈ, Π° Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡΡ ΡΡΠΈΡΡΠ²Π°ΡΡΠΈΠΉ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π±ΡΡΠ΅Ρ ΠΏΡΡΡ ΠΈ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΎΠ»Π½ΡΡΡ ΡΠ½ΠΎΠ²Π°. ΠΠ° ΡΠΈΡ. 10.13 ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π° Π²ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π΄ΠΈΠ°Π³ΡΠ°ΠΌΠΌΠ° Π΄Π»Ρ Π½ΠΎΠ²ΠΎΠΉ ΡΡ Π΅ΠΌΡ.