Π€ΡΠ½ΠΊΡΠΈΡ pthread_once () Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎΡΠΊΠΎΠΉ ΠΎΡ ΠΌ Π΅Π½Ρ. ΠΠΎ Π΅ΡΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ init_routine ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎΡΠΊΠΎΠΉ ΠΎΡ ΠΌ Π΅Π½Ρ, ΠΈ ΠΎΡ ΠΌ Π΅Π½Π° ΡΠ°ΠΊΠΈ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ, ΡΠΎ Π΅Π΅ Π²ΠΎΠ·Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π½Π° ΠΏΠ°ΡΠ° ΠΌ Π΅ΡΡ once_control Π±ΡΠ΄Π΅Ρ ΡΠ°ΠΊΠΈ ΠΌ, ΠΊΠ°ΠΊ Π΅ΡΠ»ΠΈ Π±Ρ ΡΡΠ½ΠΊΡΠΈΡ pthread_once () Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π»Π°ΡΡ.
ΠΠΎΠ½ΡΡΠ°Π½ΡΠ° PTHREAD_ONCE_INIT ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ <pthread. h>.
ΠΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ pthread_once () Π±ΡΠ΄Π΅Ρ Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½Ρ ΠΌ, Π΅ΡΠ»ΠΈ ΠΏΠ°ΡΠ° ΠΌ Π΅ΡΡ once_control ΠΈ ΠΌ Π΅Π΅Ρ Π°Π²ΡΠΎ ΠΌ Π°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΊΠ»Π°ΡΡ ΠΏΠ° ΠΌ ΡΡΠΈ (ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΡΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° ΡΠ°Π· ΠΌ Π΅ Ρ Π°ΡΡΡΡ Π² ΡΡΠ΅ΠΊΠ΅ ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΡΡΡΡ Π²ΡΡΠΊΠΈΠΉ ΡΠ°Π· ΠΏΡΠΈ Π²Ρ ΠΎΠ΄Π΅ Π² Π±Π»ΠΎΠΊ, Π³Π΄Π΅ ΠΎΠ½ΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Ρ, ΠΈΡΠ°Π·ΡΡΡΠ°ΡΡΡΡ ΠΏΡΠΈ Π²ΡΡ ΠΎΠ΄Π΅ ΠΈΠ· ΡΡΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°) ΠΈΠ»ΠΈ Π½Π΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠΎΠΉ PTHREAD_ONCE_INIT.
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
ΠΡΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΌ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΡ pthread_once () Π²ΠΎΠ·Π²ΡΠ° Ρ Π°Π΅Ρ Π½ΡΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅; Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎ ΠΌ ΡΠ»ΡΡΠ°Π΅ β ΠΊΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ, ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°ΡΡΠΈΠΉ Π΅Π΅ Ρ Π°ΡΠ°ΠΊΡΠ΅Ρ.
ΠΡΠΈΠ±ΠΊΠΈ
Π€ΡΠ½ΠΊΡΠΈΡ pthread_once() ΠΌ ΠΎΠΆΠ΅Ρ Π·Π°Π²Π΅ΡΡΠΈΡΡΡΡ Π½Π΅ΡΠ΄Π°ΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ:
[EINVAL] Π·Π½Π°ΡΠ΅Π½ΠΈΡ, Π·Π°Π΄Π°Π½Π½ΡΠ΅ ΠΏΠ°ΡΠ° ΠΌ Π΅ΡΡΠ° ΠΌ ΠΈ once_control ΠΈΠ»ΠΈ init_routine, Π½Π΅Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½Ρ. Π€ΡΠ½ΠΊΡΠΈΡ pthread_once() Π½Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ [EINTR].
ΠΡΠΈΠΌΠ΅ΡΡ
ΠΡΡΡΡΡΡΠ²ΡΡΡ.
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΡ ΠΏΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ
ΠΡΡΡΡΡΡΠ²ΡΡΡ.
ΠΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΎΠ±ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠ΅
ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π‘ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½Ρ Π΄Π»Ρ Π΄ΠΈΠ½Π° ΠΌ ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π³Π»ΠΎΠ±Π°Π»ΡΠ½Π°Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄Π»Ρ ΡΠ°ΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΠΏΠ΅ΡΠ²ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΠΎΠΉ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ. Π ΠΎΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ° ΠΌΠΌ Π΅ ΡΡΠΎ ΠΎΠ±ΡΡΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΏΠ΅ΡΠ΅ ΠΌ Π΅Π½Π½ΠΎΠΉ, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ ΠΏΡΠΈ Π²Ρ ΠΎΠ΄Π΅ Π² ΡΡΠ½ΠΊΡΠΈΡ, Π½Π°ΠΏΡΠΈ ΠΌ Π΅Ρ:
static int random_is_initialized = 0;
extern int initialize_random ();
int random_function () {
if (random_is_initialized == 0) {
initialize_random ();
random_is_initialized = 1;
}
... /* ΠΠΏΠ΅ΡΠ°ΡΠΈΠΈ, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠ΅ ΠΏΠΎΡΠ»Π΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ. */
}
Π§ΡΠΎΠ±Ρ Ρ ΡΠ°Π½ΠΈΡΡ ΡΠ°ΠΊΡΡ ΠΆΠ΅ ΡΡΡΡΠΊΡΡΡΡ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅, Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½ΠΎΠ²ΡΠΉ ΠΏΡΠΈΠΌΠΈΡΠΈΠ². Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π° ΠΏΡΡΠ΅ΠΌ ΡΠ²Π½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄ΠΎ ΠΊΠ°ΠΊΠΎΠ³ΠΎ Π±Ρ ΡΠΎ Π½ΠΈ Π±ΡΠ»ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ.
ΠΠ»Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ΅ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΡΠ»Π°Π³Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ; ΡΡΠΎΡ ΡΠ»Π°Π³ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΡΠΈΡΠ°ΡΡ ΠΎΡ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π΄Π°Π½Π½ΡΡ ΡΠΎ ΡΡΠΎΡΠΎΠ½Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΠΈΡ ΡΡ ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅. ΠΠ°ΡΠΈΡΠ° ΡΠ»Π°Π³Π° ΡΡΠ΅Π±ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΌΡΡΡΠ΅ΠΊΡΠ°, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΌΡΡΡΠ΅ΠΊΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Ρ Π΄ΠΎ ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ. ΠΠ»Ρ Π³Π°ΡΠ°Π½ΡΠΈΠΈ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΌΡΡΡΠ΅ΠΊΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΅Π΄ΠΈΠ½ΠΎΠΆΠ΄Ρ, ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ.
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ pthread_once () Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΡΡΠ΅Π΄ΡΡΠ²Π° Π΄ΠΈΠ½Π° ΠΌ ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, Π½ΠΎ ΠΈ ΡΠΏΠΎΡΠΎΠ±ΡΡΠ²ΡΠ΅Ρ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΌΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ ΠΌ Π΅Π½ΠΈ. ΠΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ Ρ ΡΡΠ΅ΡΠΎΠΌ Π²ΡΡΠ΅ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π²ΠΈΠ΄.
#include <pthread.h>
static pthread_once_t random_is_initialized =PTHREAD_ONCE_INIT;
extern int initialize_random();
int random_function()
{
(void) pthread_once (&random_is_initialized,initialize_random); ...
/* ΠΠΏΠ΅ΡΠ°ΡΠΈΠΈ, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠ΅ ΠΏΠΎΡΠ»Π΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ. */
}
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈ ΠΌ Π°Π½ΠΈΠ΅ Π½Π° ΡΠΎ, ΡΡΠΎ ΡΠΈΠΏ pthread_once_t Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΄Π»Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠ² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ &<array_name> Π½Π΅ΠΏΡΠΈΠ΅ΠΌΠ»Π΅ΠΌΠ°.
ΠΡΠ΄ΡΡΠΈΠ΅ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ
ΠΡΡΡΡΡΡΠ²ΡΡΡ.
Π‘ΠΌΠΎΡΡΠΈ ΡΠ°ΠΊΠΆΠ΅
Π’ΠΎΠΌ Base Definitions ΡΡΠ°Π½Π΄Π°ΡΡΠ°1ΠΠΠStd 1003.1-2001, <pthread.h>.
ΠΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π²Π½Π΅ΡΠ΅Π½ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
Π€ΡΠ½ΠΊΡΠΈΠΈ Π²ΠΏΠ΅ΡΠ²ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ Π² Π²ΡΠΏΡΡΠΊΠ΅ Issue 5. ΠΠΊΠ»ΡΡΠ΅Π½Ρ Π΄Π»Ρ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½ΠΈΡ Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ POSIX Threads Extension.
Issue 6
Π€ΡΠ½ΠΊΡΠΈΡ pthread_once () ΠΎΡ ΠΌ Π΅ΡΠ΅Π½Π° ΠΊΠ°ΠΊ ΡΠ°ΡΡΡ ΠΎΠΏΡΠΈΠΈ Threads.
ΠΡΠ» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΊΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ [EINVAL], Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΉ ΠΏΡΠΈ Π½Π΅ΡΠ΄Π°ΡΠ½ΠΎΠΌ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ Ρ ΠΎΡΡ Π±Ρ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² Π½Π΅Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»Π΅Π½.
pthread_rwlock_destroy, pthread_rwlock_init
ΠΠΌΡ
pthread_rwlock_destroy, pthread_rwlock_init β ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°Π·ΡΡΡΠ΅Π½ΠΈΡ ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ.
Π‘ΠΈΠ½ΠΎΠΏΡΠΈΡ
THR
#include <pthread.h>
int pthread_rvlock_destroy(pthread_rwlock_t *rwlock);
int pthread_rwlock_init( pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅
Π€ΡΠ½ΠΊΡΠΈΡ pthread_rwlock_destroy() ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠ°Π·ΡΡΡΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ, Π°Π΄ΡΠ΅ΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ rwlock, ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π΅Π½ΠΈΡ Π»ΡΠ±ΡΡ ΡΠ΅ΡΡΡΡΠΎΠ², Π·Π°Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°Π½Π½ΡΡ ΡΡΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΎΠΉ. Π Π΅Π·ΡΠ»ΡΡΠ°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΎΠ±ΡΠ΅ΠΊΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎ ΠΌ Π΅ΡΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊ ΡΡΠ½ΠΊΡΠΈΠΈ pthread_rwlock_init(). Π ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΡ pthread_rwlock_destroy () ΠΌΠΎΠΆΠ΅Ρ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ, Π°Π΄ΡΠ΅ΡΡΠ΅ΠΌΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ rwlock, ΡΠ°Π²Π½ΡΠΌ Π½Π΅Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ. Π Π΅Π·ΡΠ»ΡΡΠ°ΡΡ Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ, Π΅ΡΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ pthread_rwlock_destroy() Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π² ΡΠΎ Π²ΡΠ΅ ΠΌ Ρ, ΠΊΠΎΠ³Π΄Π° ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΏΠΎΡΠΎΠΊ ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ, Π°Π΄ΡΠ΅ΡΡΠ΅ ΠΌ ΡΠΉ ΠΏΠ°ΡΠ° ΠΌ Π΅ΡΡΠΎΠΌ rwlock. ΠΠΎΠΏΡΡΠΊΠ° ΡΠ°Π·ΡΡΡΠΈΡΡ Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ.
Π€ΡΠ½ΠΊΡΠΈΡ pthread_rwlock_init() Π²ΡΠ΄Π΅Π»ΡΠ΅Ρ Π»ΡΠ±ΡΠ΅ ΡΠ΅ΡΡΡΡΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ, Π°Π΄ΡΠ΅ΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΏΠ°ΡΠ° ΠΌ Π΅ΡΡΠΎΠΌ rwlock, ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ Π΅Π³ΠΎ (ΠΎΠ½ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡ Π² Π½Π΅Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅) Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π°ΡΡΠΈΠ±ΡΡΠΎΠ², Π°Π΄ΡΠ΅ΡΡΠ΅ ΠΌ ΠΎΠ³ΠΎ ΠΏΠ°ΡΠ° ΠΌ Π΅ΡΡΠΎ ΠΌ attr. ΠΡΠ»ΠΈ ΠΏΠ°ΡΠ° ΠΌ Π΅ΡΡ attr ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ NULL, Π΄Π»Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ Π±ΡΠ΄ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Ρ Π°ΡΡΠΈΠ±ΡΡΡ, Π΄Π΅ΠΉΡΡΠ²ΡΡΡΠΈΠ΅ ΠΏΠΎ Ρ ΠΌ ΠΎΠ»ΡΠ°Π½ΠΈΡ; Ρ.Π΅. ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π² ΡΡΠΎ ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ°Π²Π½ΠΎΡΠΈΠ»Π΅Π½ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ Π°Π΄ΡΠ΅ΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π³ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ Π°ΡΡΠΈΠ±ΡΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ. ΠΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΡΠ±ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ΡΠ°Π· Π±Π΅Π· ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ. Π Π΅Π·ΡΠ»ΡΡΠ°ΡΡ Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ, Π΅ΡΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡ pthread_rwlock_init () Π²ΡΠ·Π²Π°Π½Π° Ρ Π·Π°Π΄Π°Π½ΠΈΠ΅ΠΌ ΡΠΆΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ. Π Π΅Π·ΡΠ»ΡΡΠ°ΡΡ Π½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ, Π΅ΡΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π±Π΅Π· ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ.
ΠΡΠΈ Π½Π΅ΡΠ΄Π°ΡΠ½ΠΎΠΌ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ pthread_rwlock_init() ΠΎΠ±ΡΠ΅ΠΊΡ, Π°Π΄ΡΠ΅ΡΡΠ΅ΠΌΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎ ΠΌ rwlock, ΠΎΡΡΠ°Π΅ΡΡΡ Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½Ρ ΠΌ, Π° ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° rwlock β Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ.
ΠΠ»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ, Π°Π΄ΡΠ΅ΡΡΠ΅ΠΌΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ rwlock. Π Π΅Π·ΡΠ»ΡΡΠ°Ρ ΡΡΡΠ»ΠΊΠΈ Π½Π° ΠΊΠΎΠΏΠΈΠΈ ΡΡΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π² Π²ΡΠ·ΠΎΠ²Π°Ρ ΡΡΠ½ΠΊΡΠΈΠΉ pthread_rwlock_destroy(), pthread_rwlock_rdlock(), pthread_rwlock_ti~ medrdlock(), pthread_rwlock_timedwrlock(), pthread_rwlock_tryrdlock(), pthread_rwlock_trywrlock (), pthread_rwlock_unlock () ΠΈΠ»ΠΈ pthread_rwlock_ wrlock () Π½Π΅ ΠΎΠΏΡΠ΅ Π΄ Π΅Π»Π΅Π½.
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
ΠΡΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΌ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ pthread_rwlock_destroy() ΠΈ pthread_rwlock_init () Π²ΠΎΠ·Π²ΡΠ° Ρ Π°ΡΡ Π½ΡΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅; Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎ ΠΌ ΡΠ»ΡΡΠ°Π΅ β ΠΊΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ, ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°Ρ Ρ ΠΈΠΉ Π΅Π΅ Ρ Π°ΡΠ°ΠΊΡΠ΅Ρ.
ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΎΡΠΈΠ±ΠΎΠΊ Ρ ΠΊΠΎΠ΄Π° ΠΌ ΠΈ [EBUSY] ΠΈ [EINVAL] ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° (Π΅ΡΠ»ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π²ΠΎΠΎΠ± Ρ Π΅) ΡΠ°ΠΊ, ΠΊΠ°ΠΊ Π±ΡΠ΄ΡΠΎ ΠΎΠ½Π° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π² ΡΠ°ΠΌΠΎΠΌ Π½Π°ΡΠ°Π»Π΅ ΡΠ°Π±ΠΎΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΈ ΠΊΠΎΠ΄ ΠΎΡΠΈΠ±ΠΊΠΈ Π² ΡΠ»ΡΡΠ°Π΅ Π΅Π΅ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π΄ΠΎ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΡΡΠ΅Π½ΠΈΡ ΠΈ Π·Π°ΠΏΠΈΡΠΈ, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ rwlock.
ΠΡΠΈΠ±ΠΊΠΈ
Π€ΡΠ½ΠΊΡΠΈΡ pthread_rwlock_destroy () ΠΌ ΠΎΠΆΠ΅Ρ Π·Π°Π²Π΅ΡΡΠΈΡΡΡΡ Π½Π΅ΡΠ΄Π°ΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ:
[EBUSY] Β ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ»Π° ΠΏΠΎΠΏΡΡΠΊΡ ΡΠ°Π·ΡΡΡΠΈΡΡ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ, Π°Π΄ΡΠ΅ΡΡΠ΅ ΠΌ ΡΠΉ ΠΏΠ°ΡΠ° ΠΌ Π΅ΡΡΠΎ ΠΌ rwlock;