ΠΠ·Π°ΠΈΠΌΠ½ΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Posix
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ Π.19 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Ρ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΈ ΡΡΠ½ΠΊΡΠΈΡ main ΠΏpoΠ³ΡaΠΌΠΌΡ, ΠΈΠ·ΠΌΠ΅ΡΡΡΡΠ΅ΠΉ Π±ΡΡΡΡΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π²Π·Π°ΠΈΠΌΠ½ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ Posix.
ΠΠΈΡΡΠΈΠ½Π³ Π.19. ΠΠ»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΈ ΡΡΠ½ΠΊΡΠΈΡ main Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠ½ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ Posix//bench/incr_pxmutex1.Ρ
1 #include "unpipc.h"
2 #define MAXNTHREADS 100
3 int nloop;
4 struct {
5 pthread_mutex_t mutex;
6 long counter;
7 } shared = {
8 PTHREAD_MUTEX_INITIALIZER
9 };
10 void *incr(void *);
11 int
12 main(int argc, char **argv)
13 {
14 int i, nthreads;
15 pthread_t tid[MAXNTHREADS];
16 if (argc != 3)
17 err_quit("usage: incr_pxmutex1 <#loops> <#threads>");
18 nloop = atoi(argv[1]);
19 nthreads = min(atoi(argv[2]), MAXNTHREADS);
20 /* Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ */
21 Pthread_mutex_lock(&shared.mutex);
22 /* ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠ² */
23 Set_concurrency(nthreads);
24 for (i = 0; i < nthreads; i++) {
25 Pthread_create(&tid[i], NULL, incr, NULL);
26 }
27 /* Π·Π°ΠΏΡΡΠΊ ΡΠ°ΠΉΠΌΠ΅ΡΠ° ΠΈ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ */
28 Start_time();
29 Pthread_mutex_unlock(&shared.mutex);
30 /* ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² */
31 for (i = 0; i < nthreads; i++) {
32 Pthread_join(tid[i], NULL);
33 }
34 printf("microseconds: %.0f usec\n", Stop_time());
35 if (shared.counter != nloop * nthreads)
36 printf("error: counter = %ld\n", shared, counter);
37 exit(0);
38 }
ΠΠ±ΡΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅4-9 Π‘ΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ Π΄Π°Π½Π½ΡΠ΅ ΡΠΎΡΡΠΎΡΡ ΠΈΠ· Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈ ΡΡΠ΅ΡΡΠΈΠΊΠ°. ΠΠ·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ.
ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠ²20-26 ΠΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅Π΄ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΡΡΠΎΠ±Ρ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΠ» ΡΡΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π²ΡΠ΅ ΠΎΠ½ΠΈ Π½Π΅ Π±ΡΠ΄ΡΡ ΡΠΎΠ·Π΄Π°Π½Ρ. ΠΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ set_concurrency, ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΠΏΠΎΡΠΎΠΊΠΈ. ΠΠ°ΠΆΠ΄ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡ incr, ΡΠ΅ΠΊΡΡ ΠΊΠΎΡΠΎΡΠΎΠΉ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΠΎΠ·ΠΆΠ΅.
ΠΠ°ΠΏΡΡΠΊ ΡΠ°ΠΉΠΌΠ΅ΡΠ° ΠΈ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ27-36 ΠΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π²ΡΠ΅Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π³Π»Π°Π²Π½ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ΡΠ°ΠΉΠΌΠ΅Ρ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅. ΠΠ°ΡΠ΅ΠΌ ΠΎΠ½ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠ΅Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΡΠ°ΠΉΠΌΠ΅Ρ ΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΠΏΠΎΠ»Π½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ. Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ Π.20 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ incr, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠΉ ΠΊΠ°ΠΆΠ΄ΡΠΌ ΠΈΠ· ΠΏΠΎΡΠΎΠΊΠΎΠ².
ΠΠΈΡΡΠΈΠ½Π³ Π.20. Π€ΡΠ½ΠΊΡΠΈΡ incr, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠ°Ρ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ//bench/incr_pxmutex1.c
39 void *
40 incr(void *arg)
41 {
42 int i;
43 for (i = 0; i < nloop; i++) {
44 Pthread_mutex_lock(&shared.mutex);
45 shared.counter++;
46 Pthread_mutex_unlock(&shared.mutex);
47 }
48 return(NULL);
49 }
Π£Π²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅ΡΡΠΈΠΊΠ° β ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΎΠ±Π»Π°ΡΡΡ ΠΊΠΎΠ΄Π°44-46 ΠΠΏΠ΅ΡΠ°ΡΠΈΡ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΡ ΡΡΠ΅ΡΡΠΈΠΊΠ° ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π½Π° Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ.
ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅Π½ΠΈΡ-Π·Π°ΠΏΠΈΡΠΈ
ΠpoΠ³ΡaΠΌΠΌa, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ°Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅Π½ΠΈΡ-Π·Π°ΠΏΠΈΡΠΈ, ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ»Π΅Π³ΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΠΎΠΉ Π²Π΅ΡΡΠΈΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ Π²Π·Π°ΠΈΠΌΠ½ΡΠΌΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡΠΌΠΈ Posix. ΠΠΎΡΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΡΠ°ΠΉΠ»Π°, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΡΡ ΠΎΠ±ΡΠΈΠΉ ΡΡΠ΅ΡΡΠΈΠΊ.
ΠΠ ΠΠΠΠ§ΠΠΠΠ
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π½Π΅ ΡΠ°ΠΊ ΡΠΆ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΈΡΡΠ΅ΠΌ, Π² ΠΊΠΎΡΠΎΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅Π½ΠΈΡ-Π·Π°ΠΏΠΈΡΠΈ, ΡΠ²Π»ΡΡΡΠΈΠ΅ΡΡ ΡΠ°ΡΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ° Unix 98 ΠΈ ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌΡΠ΅ ΡΠ°Π±ΠΎΡΠ΅ΠΉ Π³ΡΡΠΏΠΏΠΎΠΉ Posix.1j. ΠΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π² ΡΡΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΠ»ΠΈΡΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ Solaris 2.6 Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ, ΠΎΠΏΠΈΡΠ°Π½Π½ΡΡ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ΅ rwlock(3T). ΠΡΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΡΠΎΡ ΠΆΠ΅ Π½Π°Π±ΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΉ, ΡΡΠΎ ΠΈ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΠΌΡΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅Π½ΠΈΡ-Π·Π°ΠΏΠΈΡΠΈ Posix. ΠΠ»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΌΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΡΠΈΠ²ΠΈΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ-ΠΎΠ±Π΅ΡΡΠΊΠΈ.
Π Digital Unix 4.0B ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅Π½ΠΈΡ-Π·Π°ΠΏΠΈΡΠΈ ΠΏΠΎΡΠΎΡΠ½ΠΎ-Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΡ ΡΠ»ΡΠΆΠ±, ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ tis_rwlock. ΠΡ Π½Π΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠΌ Π»ΠΈΡΡΠΈΠ½Π³ΠΎΠ² Ρ Π½Π΅ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΌΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΠΌΠΈ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΌΠΈ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ.
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ Π.21 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ main, Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ Π.22 β ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ incr.
ΠΠΈΡΡΠΈΠ½Π³ Π.21. Π€ΡΠ½ΠΊΡΠΈΡ main Π΄Π»Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ ΡΡΠ΅Π½ΠΈΡ-Π·Π°ΠΏΠΈΡΠΈ//bench/incr_rwlock1.c
1 #include "unpipc.h"
2 #include <synch.h> /* ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» Π΄Π»Ρ Solaris */
3 void Rw_wrlock(rwlock_t *rwptr);
4 void Rw_unlock(rwlock_t *rwptr);
5 #define MAXNTHREADS 100
6 int nloop;
7 struct {
8 rwlock_t rwlock; /* ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ Solaris */
9 long counter;
10 } shared; /* ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π β> USYNC_THREAD */
11 void *incr(void *);
12 int
13 main(int argc, char **argv)
14 {
15 int i, nthreads;
16 pthread_t tid[MAXNTHREADS];
17 if (argc != 3)
18 err_quit("usage: incr_rwlockl <#loops> <#threads>");
19 nloop = atoi(argv[1]);
20 nthreads = min(atoi(argv[2]), MAXNTHREADS);
21 /* ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π½Π° Π·Π°ΠΏΠΈΡΡ */
22 Rw_wrlock(&shared.rwlock);
23 /* ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π²ΡΠ΅Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ² */
24 Set_concurrency(nthreads);
25 for (i = 0; i < nthreads; i++) {
26 Pthread_create(&tid[i], NULL, incr, NULL);
27 }
28 /* Π·Π°ΠΏΡΡΠΊ ΡΠ°ΠΉΠΌΠ΅ΡΠ° ΠΈ ΡΠ½ΡΡΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ */
29 Start_time();
30 Rw_unlock(&shared.rwlock);
31 /* ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠ΅Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ² */
32 for (i = 0; i < nthreads; i++) {
33 Pthread_join(tid[i], NULL);
34 }
35 printf("microseconds: %.0f usec\n", Stop_time());
36 if (shared.counter != nloop * nthreads)
37 printf("error: counter = %ld\n", shared.counter);
38 exit(0);
39 }
ΠΠΈΡΡΠΈΠ½Π³ Π.22. Π£Π²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅Π³ΠΎ ΡΡΠ΅ΡΡΠΈΠΊΠ° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ ΡΡΠ΅Π½ΠΈΡ-Π·Π°ΠΏΠΈΡΠΈ//bench/incr_rwlock1.c
40 void *
41 incr(void *arg)
42 {
43 int i;
44 for (i = 0; i < nloop; i++) {
45 Rw_wrlock(&shared.rwlock);
46 shared.counter++;
47 Rw_unlock(&shared.rwlock);
48 }
49 return(NULL);
50 }
Π‘Π΅ΠΌΠ°ΡΠΎΡΡ Posix, ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅ΠΌΡΠ΅ Π² ΠΏΠ°ΠΌΡΡΠΈ
ΠΡ ΠΈΠ·ΠΌΠ΅ΡΡΠ΅ΠΌ ΡΠΊΠΎΡΠΎΡΡΡ ΡΠ°Π±ΠΎΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² Posix (ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΡ ΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅ΠΌΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ). Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ Π.24 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ main, Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ Π.23 β ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ incr.
ΠΠΈΡΡΠΈΠ½Π³ Π.23. Π£Π²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅ΡΡΠΈΠΊΠ° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² Posix Π² ΠΏΠ°ΠΌΡΡΠΈ//bench/incr_pxsem1.Ρ
37 void *
38 incr(void *arg)
39 {
40 int i;
41 for (i = 0; i < nloop; i++) {
42 Sem_wait(&shared.mutex);
43 shared.counter++;
44 Sem_post(&shared.mutex);
45 }
46 return(NULL);
47 }
ΠΠΈΡΡΠΈΠ½Π³ Π.24. Π€ΡΠ½ΠΊΡΠΈΡ main Π΄Π»Ρ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² Posix, ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅ΠΌΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ//bench/incr_pxsem1.Ρ
1 #include "unpipc.h"
2 #define MAXNTHREADS 100
3 int nloop;
4 struct {
5 sem_t mutex; /* ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅ΠΌΡΠΉ Π² ΠΏΠ°ΠΌΡΡΠΈ ΡΠ΅ΠΌΠ°ΡΠΎΡ */
6 long counter;
7 } shared;
8 void *incr(void *);
9 int
10 main(int argc, char **argv)
11 {
12 int i, nthreads;
13 pthread_t tid[MAXNTHREADS];
14 if (argc != 3)
15 err_quit("usage: incr_pxseml <#loops> <#threads>");
16 nloop = atoi(argv[1]);
17 nthreads = min(atoi(argv[2]), MAXNTHREADS);
18 /* ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅ΠΌΠΎΠ³ΠΎ Π² ΠΏΠ°ΠΌΡΡΠΈ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° 0 */
19 Sem_init(&shared.mutex, 0, 0);
20 /* ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π²ΡΠ΅Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ² */
21 Set_concurrency(nthreads);
22 for (i = 0; i < nthreads; i++) {
23 Pthread_create(&tid[i], NULL, incr, NULL);
24 }
25 /* Π·Π°ΠΏΡΡΠΊ ΡΠ°ΠΉΠΌΠ΅ΡΠ° ΠΈ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° */
26 Start_time();
27 Sem_post(&shared.mutex);
28 /* ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠ΅Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ² */
29 for (i = 0; i < nthreads; i++) {
30 Pthread_join(tid[i], NULL);
31 }
32 printf("microseconds: %.0f usec\n", Stop_time());
33 if (shared.counter != nloop * nthreads)
34 printf("error: counter = %ld\n", shared.counter);
35 exit(0);
36 }
18-19 Π‘ΠΎΠ·Π΄Π°Π΅ΡΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡ, ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌΡΠΉ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ 0. ΠΡΠΎΡΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π² Π²ΡΠ·ΠΎΠ²Π΅ sem_init, ΠΈΠΌΠ΅ΡΡΠΈΠΉ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 0, Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ Π²ΡΠ·Π²Π°Π²ΡΠ΅Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°.
20-27 ΠΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π²ΡΠ΅Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΡΠ°ΠΉΠΌΠ΅Ρ ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ sem_post.
ΠΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠ΅ΠΌΠ°ΡΠΎΡΡ Posix
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ Π.26 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ main, ΠΈΠ·ΠΌΠ΅ΡΡΡΡΠ΅ΠΉ Π±ΡΡΡΡΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² Posix, Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ Π.25 β ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ incr.
ΠΠΈΡΡΠΈΠ½Π³ Π.25. Π£Π²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅Π³ΠΎ ΡΡΠ΅ΡΡΠΈΠΊΠ° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° Posix//bench/incr_pxsem2.c
40 void *
41 incr(void *arg)
42 {
43 int i;
44 for (i = 0; i < nloop; i++) {
45 Sem_wait(shared.mutex);
46 shared.counter++;