Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QNX/UNIX: Анатомия ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 74

Автор Π¦ΠΈΠ»ΡŽΡ€ΠΈΠΊ ОлСг Π˜Π²Π°Π½ΠΎΠ²ΠΈΡ‡

int pthread_barrierattr_setpshared(

pthread_barrierattr_t* attr, int pshared);

int pthread_barrierattr_getpshared(

const pthread_barrierattr_t* attr, int* pshared);

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π±Π°Ρ€ΡŒΠ΅Ρ€Π° Π·Π°ΠΏΡ€Π΅Ρ‰Π°ΡŽΡ‚ доступ ΠΊ элСмСнту синхронизации ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… процСссов.

ОбС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ значСния:

EOK
β€” ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅;

EINVAL
β€” ΠΎΠ΄Π½ΠΎ ΠΈΠ»ΠΈ ΠΎΠ±Π° ΠΈΠ· ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π΅Π²Π΅Ρ€Π½Ρ‹.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΈ Ρ€Π°Π·Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ Π±Π°Ρ€ΡŒΠ΅Ρ€Π°

int pthread_barrier_init(pthread_barrier_t* barrier,

Β const pthread_barrierattr_t* attr, unsigned int count);

Ѐункция ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ синхронизации Ρ‚ΠΈΠΏΠ° Π±Π°Ρ€ΡŒΠ΅Ρ€, послС Ρ‡Π΅Π³ΠΎ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Π’ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°Ρ… Π±Π°Ρ€ΡŒΠ΅Ρ€Π° устанавливаСтся (ΠΈΠ»ΠΈ запрСщаСтся) Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ доступа ΠΊ Π±Π°Ρ€ΡŒΠ΅Ρ€Ρƒ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… процСссов. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ‚Π°ΠΊΠΎΠΉ доступ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ доступа ΠΊ созданному Ρ€Π°Π½Π΅Π΅ Π±Π°Ρ€ΡŒΠ΅Ρ€Ρƒ, Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°Π·Ρ€ΡƒΡˆΠΈΡ‚ΡŒ, ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°Ρ€ΡŒΠ΅Ρ€ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€

count
ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΎΠ΅ количСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ Π½Π° Π±Π°Ρ€ΡŒΠ΅Ρ€Π΅ Π΄ΠΎ ΠΈΡ… освобоТдСния.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния:

EOK
β€” ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅;

EAGAIN
β€” систСмС Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ рСсурсов для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±Π°Ρ€ΡŒΠ΅Ρ€Π°;

EBUSY
β€” ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡƒΠΆΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π±Π°Ρ€ΡŒΠ΅Ρ€Π°;

EFAULT
β€” сбой ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π» ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ядра ΠΊ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ;

EINVAL
β€”
attr
ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ².

int pthread_barrier_destroy(pthread_barrier_t* barrier);

Ѐункция Ρ€Π°Π·Ρ€ΡƒΡˆΠ°Π΅Ρ‚ Π±Π°Ρ€ΡŒΠ΅Ρ€, послС Ρ‡Π΅Π³ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт синхронизации

barrier
Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π±Π΅Π· ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ Π΅Π³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния:

EOK
β€” ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅;

EBUSY
β€” Π² настоящСС врСмя Π΅ΡΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π½Π° Π±Π°Ρ€ΡŒΠ΅Ρ€Π΅;

EINVAL
β€” Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚
barrier
.

ОТиданиС Π½Π° Π±Π°Ρ€ΡŒΠ΅Ρ€Π΅

Ѐункция оТидания (синхронизации) Π½Π° Π±Π°Ρ€ΡŒΠ΅Ρ€Π΅:

int pthread_barrier_wait(pthread_barrier_t* barrier);

Π’Ρ‹Π·ΠΎΠ² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π° Π±Π°Ρ€ΡŒΠ΅Ρ€Π΅ Π½Π΅ накопится количСство Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Ρ€Π°Π½Π΅Π΅ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

pthread_barrier_init()
.

НСобходимо с особой ΠΎΡΡ‚ΠΎΡ€ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚ΡŒΡΡ ΠΊ использованию Π±Π°Ρ€ΡŒΠ΅Ρ€ΠΎΠ² для остановки ΠΈ синхронизации ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ². ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ Ρƒ Π±Π°Ρ€ΡŒΠ΅Ρ€Π°, находятся Π² Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ΅ Π½Π° условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ), Ρ‚ΠΎ систСма Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ отслСТиваСт эффСкты, связанныС с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ инвСрсиСй ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ².

Если ΠΏΠΎΡ‚ΠΎΠΊ, Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π½Π° Π±Π°Ρ€ΡŒΠ΅Ρ€Π΅, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ сигнал, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ, Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала выполняСтся, Π½ΠΎ ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Π΅Π³ΠΎ выполнСния ΠΏΠΎΡ‚ΠΎΠΊ вновь блокируСтся Π΄ΠΎ выполнСния условия Π±Π°Ρ€ΡŒΠ΅Ρ€Π°.

ДокумСнтация QNX ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ нСльзя Π·Π°Ρ€Π°Π½Π΅Π΅ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π±ΡƒΠ΄Π΅Ρ‚ освобоТдСн ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ, ΠΊΠΎΠ³Π΄Π° Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ количСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² достигнСт Π±Π°Ρ€ΡŒΠ΅Ρ€Π°. Учитывая, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ использовалась комбинация ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° с условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (ΠΊΠ°ΠΊ Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ опрСдСлСния, Ρ‚ΠΈΠΏΠ°

pthread_barrier_t
), освобоТдСниС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π½Π° условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΡ… Β«ΡˆΠΈΡ€ΠΎΠΊΠΎΠ²Π΅Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅Β» (broadcast), ΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅, освобоТдСниС. ДокумСнтация QNX ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Β«ΠΎΡ‚ΠΏΡƒΡ‰Π΅Π½Β» Ρ‚ΠΎΡ‚ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΆΠ΄Π°Π» дольшС Π΄Ρ€ΡƒΠ³ΠΈΡ….

Ѐункция оТидания Π½Π° Π±Π°Ρ€ΡŒΠ΅Ρ€Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ значСния:

BARRIER_SERIAL_THREAD
β€” для ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², Π΄ΠΎΡΡ‚ΠΈΠ³ΡˆΠ΅Π³ΠΎ Π±Π°Ρ€ΡŒΠ΅Ρ€Π° ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π½Π° Π½Π΅ΠΌ;

0
β€” для всСх ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²;

EINVAL
β€” ΠΏΡ€ΠΈ ошибкС выполнСния, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ нСкоррСктности ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±Π°Ρ€ΡŒΠ΅Ρ€Π°.

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния/записи

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° чтСния/записи являСтся спСцифичСским ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ, ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΠΌΡΡ ΠΎΡ‚ рассмотрСнных Π²Ρ‹ΡˆΠ΅. Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ° состоит Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ:

β€’Β Π”Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π΄Π°ΠΆΠ΅ ΠΏΠΎ POSIX являСтся Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ. Часто этот Ρ‚ΠΈΠΏ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ надстройка Π½Π°Π΄ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π°ΠΌΠΈ. Π£. БтивСнс [2] ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Ρ‚Π°ΠΊΠΎΠΉ Β«ΠΎΠ±Π΅Ρ€Ρ‚ΠΎΡ‡Π½ΠΎΠΉΒ» Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ссылки Π½Π° Π΅Ρ‰Π΅ нСсколько Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ², Π² Ρ‚ΠΎΠΌ числС ΠΈ Π½Π° ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ стандартом IEEE 1996.

β€’Β Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, обСспСчиваСмая Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ чтСния/записи, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ прСдоставлСна ΠΈ простым использованиСм Π΄Ρ€ΡƒΠ³ΠΈΡ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ², ΠΎΠ΄Π½Π°ΠΊΠΎ рСализация с Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ чтСния/записи ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ эффСктивнСС ΠΏΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ прилоТСния (ΠΊΠ°ΠΊ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ ΠΏΠΎΠ·ΠΆΠ΅).

Π¦Π΅Π»Π΅ΡΠΎΠΎΠ±Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ привлСчСния Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния/записи Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° всС мноТСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Ρ‡Π΅Ρ‚Π»ΠΈΠ²ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΎ Π½Π° Π΄Π²Π΅ Π³Ρ€ΡƒΠΏΠΏΡ‹: ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Π·Π°Ρ‰ΠΈΡ‰Π°Π΅ΠΌΡ‹Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ Π΄Π°Π½Π½Ρ‹Π΅ (Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ), ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ эти Π΄Π°Π½Π½Ρ‹Π΅ (писатСли). Вакая ситуация Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π² области Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠ±ΡŠΠ΅ΠΌΠ½Ρ‹ΠΌΠΈ, слоТно структурированными Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

ΠŸΡ€ΠΈ использовании Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния/записи, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ€Π°Π½Π΅Π΅ рассмотрСнных ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ², вводится Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚Π°ΠΊΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ для считывания ΠΈ записи. ΠŸΡ€ΠΈ этом Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°:

β€’Β Π›ΡŽΠ±ΠΎΠ΅ количСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ рСсурс для считывания, Ссли Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π» Π΅Π³ΠΎ ΠΏΠΎ записи.

‒ НаличиС мноТСствСнных Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ ΠΏΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΡŽ Π½Π΅ прСпятствуСт (Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚) Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²-Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ свои ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с рСсурсом.

β€’Β Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΏΠΎ записи ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ установлСна, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ рСсурс Π½ΠΈ ΠΏΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΡŽ, Π½ΠΈ ΠΏΠΎ записи.

β€’Β Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΏΠΎ записи Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΡƒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ рСсурса (Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ процСсс) ΠΈ ΠΏΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΡŽ, ΠΈ ΠΏΠΎ записи.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ чтСния/записи ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹, ΠΊΠ°ΠΊ ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² синхронизации, Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅

<pthread.h>
.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°ΠΌΠΈ чтСния/записи

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ

int pthread_rwlock_init(pthread_rwlock_t* rwl,

Β const pthread_rwlockattr_t* attr);

int pthread_rwlock_destroy(pthread_rwlock_t* rwl);

Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚/Ρ€Π°Π·Ρ€ΡƒΡˆΠ°Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ чтСния/записи. ΠŸΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Π΅ΠΉ пСрСдаСтся структура ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ

pthread_rwlockattr_t
, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ доступа ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… процСссов.

ВмСсто прямого Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

pthread_rwlock_init()
для Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ статичСских Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ чтСния/записи (Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ пространства ΠΈΠΌΠ΅Π½
namespace
Π»ΠΈΠ±ΠΎ явно описанных с ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ
static
) ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ макросом
PTHREAD_RWLOCK_INITIALIZER
.