ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° Β«ΠΊΠ»Π°ΡΡΠ½ΠΎΠΉ Π΄ΠΎΡΠΊΠΈΒ» ΡΠ»ΡΠΆΠΈΡ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΡΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ ΡΡΡΡΠΊΡΡΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° Β«ΠΌΡΡΡΠ΅ΠΊΡΠΎΠ² ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡΒ» ΠΈ ΠΌΡΡΡΠ΅ΠΊΡΠΎΠ² Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±ΡΠ΅Π³ΠΎ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΡ. ΠΠΎΠ΄ Β«ΠΊΠ»Π°ΡΡΠ½ΠΎΠΉ Π΄ΠΎΡΠΊΠΎΠΉΒ» ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΡΡΡ ΠΎΠ±Π»Π°ΡΡΡ ΠΏΠ°ΠΌΡΡΠΈ, ΡΠ°Π·Π΄Π΅Π»ΡΠ΅ΠΌΠ°Π» ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΌΠΈ Π·Π°Π΄Π°ΡΠ°ΠΌΠΈ. Β«ΠΠ»Π°ΡΡΠ½Π°Ρ Π΄ΠΎΡΠΊΠ°Β» ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΊΠΎΡΠΎΡΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΡΠΌΠΈ ΡΡΠΈΠ»ΠΈΡΠΌΠΈ ΡΠ΅ΡΠ°Π΅Ρ ΡΠ΅Π»Π°Ρ Π³ΡΡΠΏΠΏΠ° Π·Π°Π΄Π°Ρ. ΠΠΎ ΠΌΠ΅ΡΠ΅ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ ΠΊ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΊΠ°ΠΆΠ΄Π°Ρ ΠΈΠ· Π½ΠΈΡ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π½Π° Β«ΠΊΠ»Π°ΡΡΠ½ΡΡ Π΄ΠΎΡΠΊΡΒ» ΠΈ ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ Π΅Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Ρ ΡΠ΅Π»ΡΡ ΠΏΠΎΠΈΡΠΊΠ° ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ², ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π΄ΡΡΠ³ΠΈΠΌΠΈ Π·Π°Π΄Π°ΡΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌΠΈ Π΄Π»Ρ Π½Π΅Π΅. Π‘ΡΡΡΠΊΡΡΡΠ° Β«ΠΊΠ»Π°ΡΡΠ½ΠΎΠΉ Π΄ΠΎΡΠΊΠΈΒ» ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΡΠ°Π·Π΄Π΅Π»ΠΎΠΌ. Π Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΌΡ Ρ ΠΎΡΠΈΠΌ, ΡΡΠΎΠ±Ρ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Π° Π·Π°Π΄Π°ΡΠ° ΠΌΠΎΠ³Π»Π° ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Β«ΠΊΠ»Π°ΡΡΠ½ΠΎΠΉ Π΄ΠΎΡΠΊΠΈΒ». ΠΠ΄Π½Π°ΠΊΠΎ Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΠ΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ Π»ΡΠ±ΠΎΠΌΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Ρ Π·Π°Π΄Π°Ρ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π΅ΡΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π°Π΄Π°Ρ ΡΠΆΠ΅ ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Β«ΠΊΠ»Π°ΡΡΠ½ΠΎΠΉ Π΄ΠΎΡΠΊΠΈΒ», Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΎ Π½Π΅ Π½Π°ΡΠ°Π»ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡΡΡ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π²ΡΠ΅ ΡΡΠΈ Π·Π°Π΄Π°ΡΠΈ Π½Π΅ Π·Π°Π²Π΅ΡΡΠ°Ρ ΡΡΠ΅Π½ΠΈΠ΅. Β«ΠΡΡΡΠ΅ΠΊΡ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡΒ» ΠΊΠ°ΠΊ ΡΠ°Π· ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΡΠ°ΠΊΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ ΡΠΏΡΠ°Π²Π»ΡΡΡ Π΄ΠΎΡΡΡΠΏΠΎΠΌ ΠΊ Β«ΠΊΠ»Π°ΡΡΠ½ΠΎΠΉ Π΄ΠΎΡΠΊΠ΅Β», ΡΠ°Π·ΡΠ΅ΡΠ°Π» Π΅Π³ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΈΡΡΠ²Π°ΡΡΠΈΠΌ Π·Π°Π΄Π°ΡΠ°ΠΌ ΠΈ Π·Π°ΠΏΡΠ΅ΡΠ°Π» Π΅Π³ΠΎ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΠΈΡ Π·Π°Π΄Π°Ρ. ΠΠΎ Π΅ΡΠ»ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π±ΡΠ΄Π΅Ρ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ, ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Β«ΠΊΠ»Π°ΡΡΠ½ΠΎΠΉ Π΄ΠΎΡΠΊΠΈΒ» Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ. Π ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ Π½ΠΈ ΠΎΠ΄Π½Π° ΡΡΠΈΡΡΠ²Π°ΡΡΠ°Π» Π·Π°Π΄Π°ΡΠ° Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΠ»Π° Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠΌΡ ΡΠ°Π·Π΄Π΅Π»Ρ. ΠΡ Ρ ΠΎΡΠΈΠΌ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ Π΄ΠΎΡΡΡΠΏ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π°Π²Π΅ΡΡΠΈΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΠ°Π» Π·Π°Π΄Π°ΡΠ°. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ Β«ΠΌΡΡΡΠ΅ΠΊΡ Π·Π°ΠΏΠΈΡΠΈΒ». Π Π»ΡΠ±ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΡΠΎΡ Β«ΠΌΡΡΡΠ΅ΠΊΡ Π·Π°ΠΏΠΈΡΠΈΒ» ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Π° Π·Π°Π΄Π°ΡΠ°. ΠΠΎΡΡΠΎΠΌΡ ΠΌΡ Π΄Π΅Π»Π°Π΅ΠΌ ΡΠ°Π·Π»ΠΈΡΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΌΡΡΡΠ΅ΠΊΡΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ, Π½ΠΎ Π½Π΅ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ, ΠΈ ΠΌΡΡΡΠ΅ΠΊΡΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΡΡΡ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ, Π½ΠΎ Π½Π΅ Π΄Π»Ρ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ. Π‘ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΌΡΡΡΠ΅ΠΊΡΠ° ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ Ρ Π½Π°Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ ΡΡΠΈΡΡΠ²Π°ΡΡΠΈΡ Π·Π°Π΄Π°Ρ, Π° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΌΡΡΡΠ΅ΠΊΡΠ° Π·Π°ΠΏΠΈΡΠΈ β ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Π° Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΠ°Π» Π·Π°Π΄Π°ΡΠ°. ΠΠΏΠΈΡΠ°Π½Π½Π°Π» ΡΡ Π΅ΠΌΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΡΡΡΡ ΠΌΠΎΠ΄Π΅Π»ΠΈ 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) {