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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΈ распрСдСлСнноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 110

Автор Π₯ьюз ΠšΠ°ΠΌΠ΅Ρ€ΠΎΠ½

АрхитСктура «классной доски» слуТит прСкрасным ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ структуры, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ прСимущСства Β«ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ² считывания» ΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠ² Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния. Под «классной доской» понимаСтся ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти, раздСляСмал ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ выполняСмыми Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ. «Классная доска» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для хранСния Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ совмСстными усилиями Ρ€Π΅ΡˆΠ°Π΅Ρ‚ цСлая Π³Ρ€ΡƒΠΏΠΏΠ° Π·Π°Π΄Π°Ρ‡. По ΠΌΠ΅Ρ€Π΅ приблиТСния Π·Π°Π΄Π°Ρ‡ ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ каТдая ΠΈΠ· Π½ΠΈΡ… записываСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π½Π° Β«ΠΊΠ»Π°ΡΡΠ½ΡƒΡŽ доску» ΠΈ просматриваСт Π΅Π΅ содСрТимоС с Ρ†Π΅Π»ΡŒΡŽ поиска Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ², сгСнСрированных Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ для Π½Π΅Π΅. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° «классной доски» являСтся критичСским Ρ€Π°Π·Π΄Π΅Π»ΠΎΠΌ. Π’ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° Π·Π°Π΄Π°Ρ‡Π° ΠΌΠΎΠ³Π»Π° ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ содСрТимоС «классной доски». Однако Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ считываниС ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ Π»ΡŽΠ±ΠΎΠΌΡƒ количСству Π·Π°Π΄Π°Ρ‡. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ссли нСсколько Π·Π°Π΄Π°Ρ‡ ΡƒΠΆΠ΅ считываСт содСрТимоС «классной доски», Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΎ Π½Π΅ Π½Π°Ρ‡Π°Π»ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° всС эти Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅. Β«ΠœΡŒΡŽΡ‚Π΅ΠΊΡ считывания» ΠΊΠ°ΠΊ Ρ€Π°Π· ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Ρ‚Π°ΠΊΠΎΠΉ ситуации, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ доступом ΠΊ «классной доскС», Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π» Π΅Π³ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ Π·Π°Π΄Π°Ρ‡Π°ΠΌ ΠΈ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π» Π΅Π³ΠΎ для Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΡ… Π·Π°Π΄Π°Ρ‡. Но Ссли Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ, содСрТимоС «классной доски» Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ. Π’ процСссС обновлСния Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½ΠΈ ΠΎΠ΄Π½Π° ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‰Π°Π» Π·Π°Π΄Π°Ρ‡Π° Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π° доступ ΠΊ критичСскому Ρ€Π°Π·Π΄Π΅Π»Ρƒ. ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ доступ для чтСния Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π°Π» Π·Π°Π΄Π°Ρ‡Π°. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Β«ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ записи». Π’ любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΡƒΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ этот Β«ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ записи» ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° Π·Π°Π΄Π°Ρ‡Π°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ блокируСтся для считывания, Π½ΠΎ Π½Π΅ для записи, ΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ блокируСтся для записи, Π½ΠΎ Π½Π΅ для считывания. Π‘ использованиСм ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° считывания Ρƒ нас ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… Π·Π°Π΄Π°Ρ‡, Π° с использованиСм ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° записи β€” Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π°Π» Π·Π°Π΄Π°Ρ‡Π°. Описаннал схСма являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΌΠΎΠ΄Π΅Π»ΠΈ CREW (Concurrent Read Exclusive Write β€” ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ΅ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅, монопольнал запись) ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования.

Для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ спСцификации нашСго ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ½ΠΎΠ³ΠΎ класса Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒΡŽ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ считывания ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ записи. Π’ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Pthreads прСдусмотрСны ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ чтСния-записи ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²:

pthread_rwlock_t ΠΈ pthread_rwlockattr_t

Π­Ρ‚ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ совмСстно с 11ю pthread_rwlock()-функциями. ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ наш интСрфСйсный класс rw_mutex для инкапсуляции ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… pthread_rwlock_t ΠΈ pthread_rwlockattr_t, Π° Ρ‚Π°ΠΊΠΆΠ΅ для Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ Pthread-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ½ΠΎΠΉ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ чтСния-записи.

Бинопсис

#include <ptrhead.h>

int pthread_rwlock_init(pthread_rwlock_t *,const pthread_rwlockattr_t *);

int pthread_rwlock_destroy(pthread_rwlock_t *) ;

int pthread_rwlock_rdlock(pthread_rwlock_t *);

int pthread_rwlock_tryrdlock(pthread_rwlock_t *);

int pthread_rwlock_wrlock(pthread_rwlock_t *);

int pthread_rwlock_trywrlock(pthread_rwlock_t *);

int pthread_rwlock_unlock(pthread_rwlock_t *);

int pthread_rwlockattr_init(pthread_rwlockattr_t *);

int pthread_rwlockattr_destroy(pthread_rwlockattr_t *);

int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *,int *);

int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *, int) ;

// Листинг 11.9. ОбъявлСниС класса rw_mutex, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ

// содСрТит ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‚ΠΈΠΏΠ° pthread_rwlock_ t

//Β ΠΈ pthread_rwlockattr_t

class rw_mutex : public mutex{

protected:

struct pthread_rwlock_t *RwLock;

struct pthread_rwlockattr_t *RwLockAttr;

public:

//.. .

int read_lock(void);

int write_lock(void);

int try_readlock(void);

int try_writelock(void);

//.. .

};

Класс rw_mutex наслСлуСт класс mutex. На рис. 11.3 ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ классами rw_mutex, mutex, synchronization_variable ΠΈ runtime_error.

Рис. 11.3. ΠžΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ классами rw_mutex, mutex, synchronization_variable ΠΈ runtime_error

Пока ΠΌΡ‹ создаСм Β«ΡƒΠ·ΠΊΠΈΠΉΒ» интСрфСйс. На Π΄Π°Π½Π½ΠΎΠΌ этапС ΠΌΡ‹ заинтСрСсованы Π² обСспСчСнии минимального Π½Π°Π±ΠΎΡ€Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΈ характСристик, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… для обобщСния нашСго класса mutex с использованиСм ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Pthread. Но послС создания Β«ΡƒΠ·ΠΊΠΎΠ³ΠΎΒ» интСрфСйса для класса mutex ΠΌΡ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΈΠΌ ΠΊΠ°ΠΊ основой для создания Β«ΠΏΠΎΠ»ΡƒΡˆΠΈΡ€ΠΎΠΊΠΎΠ³ΠΎΒ» интСрфСйса. Β«Π£Π·ΠΊΠΈΠΉΒ» интСрфСйс ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ примСняСтся Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ классов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ связаны наслСдованиСм. Β«Π¨ΠΈΡ€ΠΎΠΊΠΈΠ΅Β» интСрфСйсы, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ ΠΊ классам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ связаны функциями, Π° Π½Π΅ наслСдованиСм. Нам Π½ΡƒΠΆΠ΅Π½ интСрфСйсный класс для упрощСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ с классами ΠΈΠ»ΠΈ функциями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌ, Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ дСйствия. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΠ½Ρ‹ΠΉ класс Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ программиста ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌΠΈ инструмСнтами. Для этого ΠΌΡ‹ Π±Π΅Ρ€Π΅ΠΌ всС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΠ»ΠΈ классы с ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ функциями, ΠΎΡ‚Π±ΠΈΡ€Π°Π΅ΠΌ всС ΠΎΠ±Ρ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ послС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ обобщСния ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ ΠΈΡ… Π² большой класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит всС Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹. Π’Π°ΠΊ опрСдСляСтся класс с Β«ΡˆΠΈΡ€ΠΎΠΊΠΈΠΌΒ» интСрфСйсом. Но Ссли Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² Π½Π΅Π³ΠΎ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² класс rw_mutex) Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΠ΅ нас Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π΄Π°Π½Π½Ρ‹Π΅, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Β«ΠΏΠΎΠ»ΡƒΡˆΠΈΡ€ΠΎΠΊΠΈΠΉΒ» интСрфСйс. Π•Π³ΠΎ прСимущСства ΠΏΠ΅Ρ€Π΅Π΄ Β«ΡˆΠΈΡ€ΠΎΠΊΠΈΠΌΒ» интСрфСйсом Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ позволяСт Π½Π°ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ связаны лишь Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ, ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ мноТСство ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ программист, Ρ‚Π΅ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТатся Π² интСрфСйсном классС с ΡƒΠ·ΠΊΠΈΠΌ «силуэтом». Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ ΠΏΡ€ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ Ρ‚Π°ΠΊΠΈΡ… Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠ°ΠΊ MPI ΠΈ PVM с POSIX-возмоТностями ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°. ОбъСдинСниС MPI-, PVM- ΠΈ POSIX-срСдств Π΄Π°Π΅Ρ‚ сотни Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌΠΈ цСлями. Π—Π°Ρ‚Ρ€Π°Ρ‚ΠΈΠ² врСмя Π½Π° ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π² интСрфСйсных классах, Π²Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚Π΅ программисту ΠΏΠΎΠ½ΠΈΠ·ΠΈΡ‚ΡŒ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ слоТности, связанный с ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ распрСдСлСнным ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, эти интСрфСйсныС классы становятся ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… прилоТСниях.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΠΎΠΉΡ‚ΠΈ ΠΊ созданию Β«ΠΏΠΎΠ»ΡƒΡˆΠΈΡ€ΠΎΠΊΠΎΠ³ΠΎΒ» интСрфСйса, построим интСрфСйсный класс для POSIX-сСмафора. И хотя сСмафор Π½Π΅ являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Pthread, ΠΎΠ½ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ примСнСния Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ срСдС. Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² срСдС, которая Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ выполняСмыС процСссы ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случалх трСбуСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ синхронизации Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰Π΅Π³ΠΎ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π°, Ρ‡Π΅ΠΌ наш класс mutex.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ класса semaphore ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 11.10.

// Листинг 11.10. ОбъявлСниС класса semaphore

class semaphore : public synchronization_variable( protected:

sem_t * Semaphore; public://.. .

int lock(void);

int unlock(void);

int trylock(void);

//. . .

};

Бинопсис

<semaphore.h>

int sem_init(sem_t *, int, unsignedint) ;

int sem_destroy(sem_t *);

sem_t *sem_open(const char *, int, ...);

int sem_close(sem_t *);

int sem_unlink(const char *);

int sem_wait(sem_t *);

int sem_trywait(sem_t *);

int sem_post(sem_t *);

int sem_getvalue(sem__t *, int *);

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ класс semaphore ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ интСрфСйс, ΠΊΠ°ΠΊ ΠΈ наш класс mutex. Π§Π΅ΠΌ ΠΆΠ΅ ΠΎΠ½ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ? Π₯отя интСрфСйсы классов mutex ΠΈ semaphore ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹, рСализация Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ lock (), unlock (), trylock () ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… прСдставляСт собой Π²Ρ‹Π·ΠΎΠ²Ρ‹ сСмафорных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ POSIX .

// Листинг 11.11. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² lock(), unlock() ΠΈ

// trylock() для класса semaphore

int semaphore::lock(void) (

//.. .

return(sem_wait(Semaphore));

}

int semaphore::unlock(void) {