ΠΠΈΡΡΠΈΠ½Π³ 30.12. Π€ΡΠ½ΠΊΡΠΈΡ my_lock_init: Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΡΠ°ΠΉΠ»Π°
//server/lock_fcntl.c
1 #include "unp.h"
2 static struct flock lock_it, unlock_it;
3 static int lock_fd = -1;
4 /* fcntl() Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡΡ, Π΅ΡΠ»ΠΈ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½Π° ΡΡΠ½ΠΊΡΠΈΡ my_lock_init() */
5 void
6 my_lock_init(char *pathname)
7 {
8 char lock_file[1024];
9 /* ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ ΡΡΡΠΎΠΊΡ Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π½Π° ΡΠ»ΡΡΠ°ΠΉ, Π΅ΡΠ»ΠΈ ΡΡΠΎ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° */
10 strncpy(lock_file, pathname, sizeof(lock_file));
11 lock_fd = Mkstemp(lock_file);
12 Unlink(lock_file); /* Π½ΠΎ lock_fd ΠΎΡΡΠ°Π΅ΡΡΡ ΠΎΡΠΊΡΡΡΡΠΌ */
13 lock_it.l_type = F_WRLCK;
14 lock_it.l_whence = SEEK_SET;
15 lock_it.l_start = 0;
16 lock_it.l_len = 0;
17 unlock_it.l_type = F_UNLCK;
18 unlock_it.l_whence = SEEK_SET;
19 unlock_it.l_start = 0;
20 unlock_it.l_len = 0;
21 }
9-12 ΠΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π·Π°Π΄Π°Π΅Ρ ΡΠ°Π±Π»ΠΎΠ½ Π΄Π»Ρ ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠ»Π° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈ my_lock_init, ΠΈ ΡΡΠ½ΠΊΡΠΈΡ mkstemp Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΡΠΎΠ³ΠΎ ΡΠ°Π±Π»ΠΎΠ½Π° ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠ΅ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π°. ΠΠ°ΡΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΡΠ°ΠΉΠ» Ρ ΡΡΠΈΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΈ ΡΡΠ°Π·Ρ ΠΆΠ΅ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ unlink, Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ΅Π³ΠΎ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π° ΡΠ΄Π°Π»ΡΠ΅ΡΡΡ ΠΈΠ· ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°. ΠΡΠ»ΠΈ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Π²ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠΈ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ ΡΠ±ΠΎΠΉ, ΡΠΎ ΡΠ°ΠΉΠ» ΠΈΡΡΠ΅Π·Π½Π΅Ρ Π±Π΅Π·Π²ΠΎΠ·Π²ΡΠ°ΡΠ½ΠΎ. ΠΠΎ ΠΏΠΎΠΊΠ° ΠΎΠ½ ΠΎΡΡΠ°Π΅ΡΡΡ ΠΎΡΠΊΡΡΡΡΠΌ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°Ρ (ΠΈΠ½ΡΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΠΏΠΎΠΊΠ° ΡΡΠ΅ΡΡΠΈΠΊ ΡΡΡΠ»ΠΎΠΊ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Π±ΠΎΠ»ΡΡΠ΅ Π½ΡΠ»Ρ), ΡΠ°ΠΌ ΡΠ°ΠΉΠ» Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ΄Π°Π»Π΅Π½. (ΠΡΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠ»Π° ΠΈΠ· ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° ΠΈ Π·Π°ΠΊΡΡΡΠΈΠ΅ΠΌ ΠΎΡΠΊΡΡΡΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΡΠ½Π΄Π°ΠΌΠ΅Π½ΡΠ°Π»ΡΠ½Π°Ρ ΡΠ°Π·Π½ΠΈΡΠ°.)
13-20 ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΡΡΡΡ Π΄Π²Π΅ ΡΡΡΡΠΊΡΡΡΡ flock: ΠΎΠ΄Π½Π° Π΄Π»Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»Π°, Π΄ΡΡΠ³Π°Ρ Π΄Π»Ρ ΡΠ½ΡΡΠΈΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ. ΠΠ»ΠΎΠΊΠΈΡΡΠ΅ΠΌΡΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Ρ Π½ΡΠ»Ρ (l_whence =SEEK_SET, l_start=0). ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ l_len ΡΠ°Π²Π½ΠΎ Π½ΡΠ»Ρ, ΡΠΎ Π΅ΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ Π²Π΅ΡΡ ΡΠ°ΠΉΠ». Π ΡΡΠΎΡ ΡΠ°ΠΉΠ» Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ (Π΅Π³ΠΎ Π΄Π»ΠΈΠ½Π° Π²ΡΠ΅Π³Π΄Π° ΡΠ°Π²Π½Π° Π½ΡΠ»Ρ), Π½ΠΎ ΡΠ°ΠΊΠΎΠΉ ΡΠΈΠΏ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ ΡΠ΄ΡΠΎΠΌ.
ΠΠ ΠΠΠΠ§ΠΠΠΠΠ‘Π½Π°ΡΠ°Π»Π° Π°Π²ΡΠΎΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π» ΡΡΠΈ ΡΡΡΡΠΊΡΡΡΡ ΠΏΡΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΈ:
static struct flock lock_it = { F_WRLCK, 0, 0, 0, 0 };
static struct flock unlock_it = { F_UNLCK, 0, 0, 0, 0 };
Π½ΠΎ ΡΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΈ Π΄Π²Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ: Ρ Π½Π°Ρ Π½Π΅Ρ Π³Π°ΡΠ°Π½ΡΠΈΠΈ, ΡΡΠΎ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° SEEK_SET ΡΠ°Π²Π½Π° Π½ΡΠ»Ρ, Π½ΠΎ, ΡΡΠΎ Π±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΠΎ, ΡΡΠ°Π½Π΄Π°ΡΡ POSIX Π½Π΅ ΡΠ΅Π³Π»Π°ΠΌΠ΅Π½ΡΠΈΡΡΠ΅Ρ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΠΎΠ»Π΅ΠΉ ΡΡΠΎΠΉ ΡΡΡΡΠΊΡΡΡΡ. POSIX Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎ, ΡΡΠΎ ΡΡΠ΅Π±ΡΠ΅ΠΌΡΠ΅ ΠΏΠΎΠ»Ρ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΡΡ Π² ΡΡΡΡΠΊΡΡΡΠ΅. POSIX Π½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠ° ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΠ»Π΅ΠΉ ΡΡΡΡΠΊΡΡΡΡ, Π° ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠΏΡΡΠΊΠ°Π΅Ρ Π½Π°Π»ΠΈΡΠΈΠ΅ Π² Π½Π΅ΠΉ ΠΏΠΎΠ»Π΅ΠΉ, Π½Π΅ ΠΎΡΠ½ΠΎΡΡΡΠΈΡ ΡΡ ΠΊ ΡΡΠ°Π½Π΄Π°ΡΡΡ POSIX. ΠΠΎΡΡΠΎΠΌΡ ΠΊΠΎΠ³Π΄Π° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΡΡ ΡΡΡΡΠΊΡΡΡΡ (Π΅ΡΠ»ΠΈ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΠ΅ ΠΏΠΎΠ»Ρ Π½ΡΠ»ΡΠΌΠΈ), ΡΡΠΎ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ Π΄Π΅Π»Π°ΡΡ ΡΠ΅ΡΠ΅Π· ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΊΠΎΠ΄ Π‘, Π° Π½Π΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡΠ° ΠΏΡΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΈ ΡΡΡΡΠΊΡΡΡΡ.
ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π° ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡ ΡΡΡΡΠΊΡΡΡΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π² POSIX Π² Π³Π»Π°Π²Π΅ 26 ΠΌΡ ΠΏΠΈΡΠ°Π»ΠΈ:
pthread_mutex_t mlock = PTHREAD_MUTEX_INITIALIZER;
Π’ΠΈΠΏ Π΄Π°Π½Π½ΡΡ pthread_mutex_t β ΡΡΠΎ Π½Π΅ΠΊΠ°Ρ ΡΡΡΡΠΊΡΡΡΠ°, Π½ΠΎ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΎΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΉ.
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 30.13 ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ Π΄Π²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΠΈ ΡΠ½ΠΈΠΌΠ°ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ Ρ ΡΠ°ΠΉΠ»Π°. ΠΠ½ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΡΠΎΠ±ΠΎΠΉ Π²ΡΠ·ΠΎΠ²Ρ ΡΡΠ½ΠΊΡΠΈΠΈ fcntl, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠ΅ ΡΡΡΡΠΊΡΡΡΡ, ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 30.12.
ΠΠΈΡΡΠΈΠ½Π³ 30.13. Π€ΡΠ½ΠΊΡΠΈΠΈ my_lock_wait (ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ°ΠΉΠ»Π°) ΠΈ my_lock_release (ΡΠ½ΡΡΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ°ΠΉΠ»Π°)
//server/lock_fcntl.c
23 void
24 my_lock_wait()
25 {
26 int rc;
27 while ((rc = fcntl(lock_ld, F_SETLKW, &lock_it)) < 0 {
28 if (errno == EINTR)
29 continue;
30 else
31 errsys("fcntl error for my_lock_wait");
32 }
33 }
34 void
35 my_lock_release()
36 {
37 if (fcntl(lock_fd, F_SETLKW, &unlock_it)) < 0)
38 errsys("fcntl error for my_lock_release");
39 }
ΠΠΎΠ²Π°Ρ Π²Π΅ΡΡΠΈΡ Π½Π°ΡΠ΅Π³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ° Ρ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΠΌ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΠΎΠ΄ SVR4, Π³Π°ΡΠ°Π½ΡΠΈΡΡΡ, ΡΡΠΎ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ Π² Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ accept. Π‘ΡΠ°Π²Π½ΠΈΠ²Π°Ρ ΡΡΡΠΎΠΊΠΈ 2 ΠΈ 3 Π² ΡΠ°Π±Π». 30.1 (ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π΄Π»Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ² Digital Unix ΠΈ BSD/OS), ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ ΡΠ°ΠΊΠΎΠΉ ΡΠΈΠΏ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ Π²ΡΠ΅ΠΌΡ, Π·Π°ΡΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΠΎΠ΅ ΡΠ΅Π½ΡΡΠ°Π»ΡΠ½ΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠΎΠΌ Π½Π° ΡΠ·Π»Π΅ ΡΠ΅ΡΠ²Π΅ΡΠ°.
ΠΠ ΠΠΠΠ§ΠΠΠΠΠΠ΅Π±-ΡΠ΅ΡΠ²Π΅Ρ Apache (http://www.apache.org) ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², ΠΏΡΠΈΡΠ΅ΠΌ Π΅ΡΠ»ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ, Π²ΡΠ΅ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ Π±Π»ΠΎΠΊΠΈΡΡΡΡΡΡ Π² Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ accept, ΠΈΠ½Π°ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΡΠ°ΠΉΠ»Π° Π΄Π»Ρ Π·Π°ΡΠΈΡΡ Π²ΡΠ·ΠΎΠ²Π° accept.
ΠΡΡΠ΅ΠΊΡ Π½Π°Π»ΠΈΡΠΈΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²
ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π»ΠΈ Π² Π΄Π°Π½Π½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ° ΡΡΡΠ΅ΠΊΡ Β«ΠΎΠ±ΡΠ΅ΠΉ ΠΏΠΎΠ±ΡΠ΄ΠΊΠΈΒ», ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΠΉ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅. ΠΠ°ΠΊ ΠΈ ΡΠ°Π½ΡΡΠ΅, Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ ΡΡ ΡΠ΄ΡΠ°Π΅ΡΡΡ ΠΏΡΠΎΠΏΠΎΡΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ ΡΠΈΡΠ»Ρ ΠΈΠ·Π±ΡΡΠΎΡΠ½ΡΡ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ².
Π Π°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ
ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΡΡ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 30.10, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΠΌΠΈ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ. Π Π΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π² ΡΠ°Π±Π». 30.2. ΠΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ° ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ°ΠΉΠ»Π° ΡΠ°Π²Π½ΠΎΠΌΠ΅ΡΠ½ΠΎ ΠΌΠ΅ΠΆΠ΄Ρ ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ, ΠΈ ΡΠ°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠ½ΠΎ Π΄Π»Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π½Π°ΠΌΠΈ ΡΠΈΡΡΠ΅ΠΌ.
30.8. Π‘Π΅ΡΠ²Π΅Ρ TCP Ρ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΠΌ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΈ Π·Π°ΡΠΈΡΠΎΠΉ Π²ΡΠ·ΠΎΠ²Π° accept ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ
ΠΠ°ΠΊ ΠΌΡ ΡΠΆΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠ»ΠΈ, ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΏΡΡΠ΅ΠΌ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΡΠ°ΠΉΠ»Π° ΠΏΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΡ POSIX, ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½Π°Ρ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅, ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΡΡΡ Π½Π° Π²ΡΠ΅ POSIX-ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ, Π½ΠΎ ΠΎΠ½Π° ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. Π ΡΡΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΠΎΠ±Π»Π°Π΄Π°ΡΡΡΡ ΡΠ΅ΠΌ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎΠΌ, ΡΡΠΎ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π΄Π»Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ² Π²Π½ΡΡΡΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°, Π½ΠΎ ΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΎΡΠ½ΠΎΡΡΡΠΈΡ ΡΡ ΠΊ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌ.
Π€ΡΠ½ΠΊΡΠΈΡ main ΠΎΡΡΠ°Π΅ΡΡΡ ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅, ΡΠΎ ΠΆΠ΅ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ ΡΡΠ½ΠΊΡΠΈΡΠΌ child_make ΠΈ child_main. ΠΠ΅Π½ΡΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡΠΈΠ΅ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ. Π§ΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ, Π²ΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Ρ ΡΠ°Π½ΠΈΡΡ ΡΡΠΎ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π² ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΏΠ°ΠΌΡΡΠΈ, Π° Π²ΠΎ-Π²ΡΠΎΡΡΡ , Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΏΠΎΡΠΎΠΊΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ.
ΠΠ ΠΠΠΠ§ΠΠΠΠΠ’ΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ°ΠΊΠΆΠ΅, ΡΡΠΎΠ±Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π»Π° Π°ΡΡΠΈΠ±ΡΡ PTHREAD_PROCESS_SHARED.
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ, ΡΡΠΎ ΠΌΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π²ΠΎ Π²ΡΠΎΡΠΎΠΌ ΡΠΎΠΌΠ΅[2] Π΄Π°Π½Π½ΠΎΠΉ ΡΠ΅ΡΠΈΠΈ. Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ mmap Ρ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΠΌ /dev/zero, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΡΠ΄ΡΠ°ΠΌΠΈ Solaris ΠΈ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΠ΄ΡΠ°ΠΌΠΈ SVR4. Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 30.14 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΡ my_lock_init.
ΠΠΈΡΡΠΈΠ½Π³ 30.14. Π€ΡΠ½ΠΊΡΠΈΡ my_lock_init: ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ, ΠΎΡΠ½ΠΎΡΡΡΠΈΠΌΠΈΡΡ ΠΊ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌ (ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡ Pthread)
//server/lock_pthread.c
1 #include "unpthread.h"
2 #include <sys/mman.h>
3 static pthread_mutex_t *mptr; /* ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ
Π² ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ */
4 void
5 my_lock_init(char *pathname)
6 {
7 int fd;
8 pthread_mutexattr_t mattr;
9 fd = Open("/dev/zero", O_RDWR, 0);
10 mptr = Mmap(0, sizeof(pthread_mutex_t), PROT_READ | PROT_WRITE,
11 MAP_SHARED, fd, 0);
12 Close(fd);
13 Pthread_mutexattr_init(&mattr);
14 Pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);
15 Pthread_mutex_init(mptr, &mattr);
16 }
9-12 ΠΡ ΠΎΡΠΊΡΡΠ²Π°Π΅ΠΌ (open) ΡΠ°ΠΉΠ» /dev/zero, Π° Π·Π°ΡΠ΅ΠΌ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ mmap. ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π±Π°ΠΉΡΠΎΠ² (Π²ΡΠΎΡΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ) β ΡΡΠΎ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ pthread_mutex_t. ΠΠ°ΡΠ΅ΠΌ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π·Π°ΠΊΡΡΠ²Π°Π΅ΡΡΡ, Π½ΠΎ Π΄Π»Ρ Π½Π°Ρ ΡΡΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΠ°ΠΉΠ» ΡΠΆΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ Π² ΠΏΠ°ΠΌΡΡΡ.
13-15 Π ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΡ ΡΠ°Π½Π΅Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ Π²Π·Π°ΠΈΠΌΠ½ΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ Pthread ΠΌΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π»ΠΈ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠ΅ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π²Π·Π°ΠΈΠΌΠ½ΡΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ PTHREAD_MUTEX_INITIALIZER (ΡΠΌ., Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π»ΠΈΡΡΠΈΠ½Π³ 26.12). ΠΠΎ ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°Ρ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π² ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ, ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΠ·Π²Π°ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Pthreads, ΡΡΠΎΠ±Ρ ΡΠΎΠΎΠ±ΡΠΈΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ ΠΎ Π½Π°Π»ΠΈΡΠΈΠΈ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° Π² ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ ΠΈ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ Π΄Π»Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΎΡΠ½ΠΎΡΡΡΠΈΡ ΡΡ ΠΊ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌ. ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΡΡΡΠΊΡΡΡΡ pthread_mutexattr_t Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡΠΌΠΈ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π°ΡΡΠΈΠ±ΡΡΠ°ΠΌΠΈ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, Π° Π·Π°ΡΠ΅ΠΌ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡΠ° PTHREAD_PROCESS_SHARED. (ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΡΠΎΠ³ΠΎ Π°ΡΡΠΈΠ±ΡΡΠ° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ PTHREAD_PROCESS_PRIVATE, ΡΡΠΎ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΏΡΠ΅Π΄Π΅Π»Π°Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°.) ΠΠ°ΡΠ΅ΠΌ Π²ΡΠ·ΠΎΠ² pthread_mutex_init ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΊΠ°Π·Π°Π½Π½ΡΠΌΠΈ Π°ΡΡΠΈΠ±ΡΡΠ°ΠΌΠΈ.