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

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

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

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ встроСнный интСрфСйсный класс, ΠΊΠ°ΠΊ mutex, Π² Π»ΡŽΠ±Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… классах, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… для бСзопасной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² выполнСния. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΠΌΡ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ с ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ класс pvm_stream. ΠžΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для хранСния ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΡ… событий для мноТСства ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. На Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π²ΠΎΠ·Π»ΠΎΠΆΠ΅Π½Π° ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π·Π° ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ сообщСний Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ PVM-Π·Π°Π΄Π°Ρ‡Π°ΠΌ. PVM-Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ. НСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² выполнСния Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ СдинствСнный PVM-класс ΠΈ Π΅Π΄ΠΈΠ½ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ событий. ΠžΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, PVM-Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ, ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒΡŽ событий ΠΈ классом pvm_stream ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Π½Π° рис. 11.1.

ΠžΡ‡Π΅Ρ€Π΅Π΄ΡŒ, показанная Π½Π° рис. 11.1, прСдставляСт собой критичСский Ρ€Π°Π·Π΄Π΅Π», ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½Π° совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ нСсколькими выполняСмыми ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. Класс pvm_stream β€” это Ρ‚Π°ΠΊΠΆΠ΅ критичСский Ρ€Π°Π·Π΄Π΅Π» ΠΈ ΠΏΠΎ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅. Если эти критичСскиС Ρ€Π°Π·Π΄Π΅Π»Ρ‹ Π½Π΅ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π½Π΅ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ, Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈ классС pvm_stream ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°Π·Ρ€ΡƒΡˆΠΈΡ‚ΡŒΡΡ. Π’ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ Π»ΠΈΠ±ΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π»ΠΈΠ±ΠΎ ΠΊΠΎΠ΄ класса pvm_stream, ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ срСду для Β«Π³ΠΎΠ½ΠΎΠΊΒ». Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ этого, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π½Π°ΡˆΡƒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΈ ΠΊ Π» асс pvm_stream встроСнны ΠΌ ΠΈ срСдства ΠΌ ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Π­Ρ‚ΠΈ срСдства Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ классом mutex. На рис. 11.2 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ° классов для Π½Π°ΡˆΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… классов x_queue ΠΈ pvm_stream.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ класс x_queue содСрТит ΠΊ Π» асс ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, Ρ‚.Π΅. ΠΌΠ΅ΠΆΠ΄Ρƒ классами x_queue ΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ сущСствуСт ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ агрСгирования. Π›ΡŽΠ±Π°Ρ опСрация, которая измСняСт состояниС нашС Π³ ΠΎ ΠΊ Π» асса x_queue, ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Β«Π³ΠΎΠ½ΠΊΠ°ΠΌΒ» Π΄Π°Π½Π½Ρ‹Ρ…, Ссли, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, эгу ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ Π½Π΅ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ Π΅Π³ΠΎ ΠΈΠ· Π½Π΅Π΅, ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚Π°ΠΌΠΈ для синхронизации. Π’ листингС 11.3 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ объявлСниС ΠΊ Π» асса x_queue ΠΊΠ°ΠΊ шаблонного.

Рис.11.1. ΠžΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ, PVM-Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ, ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒΡŽ событий ΠΈ классом pvm_stream Π² PVM-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅

Рис.11.2. Π”ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ° классов для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… классов x_queue ΠΈ pvm_stream

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

template <class T> x_queue class{

protected:

queue<T> EventQ;

mutex Mutex;

//...

public:

bool enqueue(T Object);

T dequeue(void);

//...

};

ΠœΠ΅Ρ‚ΠΎΠ΄ enqueue() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для добавлСния элСмСнтов Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ dequeue() β€” для удалСния ΠΈΡ… ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² рассчитан Π½Π° использованиС oбъeΠΊΡ‚aMutex. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ Π² листингС 11.4.

// Листинг 11.4. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² enqueue() ΠΈ dequeue()

tempIate<class T> bool x_queue<T>::enqueue(T Object)

{

Mutex.lock(); EventQ.push(Object); Mutex.unlock();

}

Leinplr.te<class T> T x_queue<T>::dequeue(void)

{

T Object; //. . .

Mutex.lock();

Object = EventQ.front()

EventQ.pop();

Mutex.unlock() ;

//. . .

return(Object);

}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ элСмСнты ΠΈ ΠΈΠ·Π±Π°Π²Π»ΡΡ‚ΡŒΡΡ ΠΎΡ‚ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ…) Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ срСдС. ΠŸΠΎΡ‚ΠΎΠΊΠ’ (см. рис.11.1) добавляСт элСмСнты Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π° потокА удаляСт ΠΈΡ… ΠΎΡ‚Ρ‚ΡƒΠ΄Π°. Класс mutex являСтся интСрфСйсным классом. Он Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_mutex_lock (), pthread_mutex_unlock (), pthread_mutex_init() ΠΈ pthread_mutex_trylock(). Класс x_queue Ρ‚Π°ΠΊΠΆΠ΅ являСтся интСрфСйсным, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚ интСрфСйс для встроСнного класса queue<T> . ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, ΠΎΠ½ замСняСт интСрфСйсы ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² push() ΠΈ pop() ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ enqueue() ΠΈ dequeue() . ΠŸΡ€ΠΈ этом ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ вставки ΠΈ удалСния элСмСнтов ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Mutex.lock() ΠΈ Mutex.unlock(). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ интСрфСйсный класс для инкапсуляции ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠ° pthread_mutex_t* ΠΈ pthread_mutexattr_t*, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π² ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΠ½ΡƒΡŽ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ нСсколько Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Pthread. А Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ интСрфСйсный класс для Π°Π΄Π°ΠΏΡ‚Π°Ρ†ΠΈΠΈ интСрфСйса класса queue<T>. Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ достоинство класса mutex состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… классах, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат критичСскиС Ρ€Π°Π·Π΄Π΅Π»Ρ‹ ΠΈΠ»ΠΈ области.

Класс pvm_stream (см. рис. 11 1) Ρ‚Π°ΠΊΠΆΠ΅ являСтся критичСским Ρ€Π°Π·Π΄Π΅Π»ΠΎΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° выполнСния (А ΠΈ Π’) ΠΈΠΌΠ΅ΡŽΡ‚ доступ ΠΊ ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π΄Π°Π½Π½Ρ‹Ρ…. ΠžΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ возникновСния Β«Π³ΠΎΠ½ΠΎΠΊΒ» Π΄Π°Π½Π½Ρ‹Ρ… здСсь Π²ΠΏΠΎΠ»Π½Π΅ Ρ€Π΅Π°Π»ΡŒΠ½Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ потокА ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ Π’ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ класс mutex Π² нашСм классС pvm_stream для обСспСчСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΉ синхронизации.

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

class pvm_stream{

protected:

mutex Mutex;

int TaskId;

int MessageId;

// . - -

public:

pvm_stream & operator <<(string X);

pvm_stream & operator Β«(int X);

pvm_stream &operator <<(float X);

pvm_stream &operator>>(string X);

//.. .

};

Как ΠΈ Π² классС x_queue, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Mutex ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ функциям, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ состояниС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса pvm_stream. НапримСр, ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² "Β«" ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ .

// Листинг 11.6. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° << для

// класса pvm_stream

pvm_stream &pvm_stream::operator<<(string X) {

//...

pvm_pkbyte(const_cast<char *>(X.data()),X.size(),1);

Mutex.lock();

pvm_send(TaskId,MessageId);

Mutex.unlock();

//.. .

return(*this);

}

Класс pvm_stream ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Mutex для синхронизации доступа ΠΊ Π΅Π³ΠΎ критичСскому Ρ€Π°Π·Π΄Π΅Π»Ρƒ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ это Π±Ρ‹Π»ΠΎ сдСлано Π² классС x_queue. Π’Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² ΠΎΠ±ΠΎΠΈΡ… случалх ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ pthread_mutex-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ . ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ синтаксисС ΠΈΡ… Π²Ρ‹Π·ΠΎΠ²Π°. Π—Π΄Π΅ΡΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π±ΠΎΠ»Π΅Π΅ простой интСрфСйс для Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ lock () ΠΈ unlock (). Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, здСсь нСльзя ΠΏΠ΅Ρ€Π΅ΠΏΡƒΡ‚Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΡƒΡŽ pthread_mutex_t*-nepeΠΌeΠ½Π½yю Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ с pthread_mutex-функциями. НаконСц, программист ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ нСсколько экзСмпляров класса mutex, Π½Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π°Π»ΡΡŒ снова ΠΈ снова ΠΊ функциям Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Pthread. Π Π°Π· ΠΌΡ‹ сдСлали ссылку Π½Π° Pthread-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² опрСдСлСниях ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΊΠ»lacca mutex, Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΌ достаточно Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ эти ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ± ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΈ интСрфСйсных классах

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ со ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ написания ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ с ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠΎΠΌ, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ API-интСрфСйс с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… систСмах, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Pthreads, MPI, Π°Ρ‚Π°ΠΊΠΆΠ΅ стандартныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ использования сСмафоров ΠΈ раздСляСмой памяти ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. ВсС эти Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ собствСнныС ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ ΠΈ синтаксис. Но Ρƒ Π½ΠΈΡ… Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Ρ‰Π΅Π³ΠΎ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйсныС классы, наслСдованиС ΠΈ ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ для создания ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈ Π½Π΅ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΠ²ΠΎΠ³ΠΎ интСрфСйса, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ нСпосрСдствСнно Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ программист. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΎΡ‚ Π½Π°ΡˆΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Если ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ опираСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² Π½Π°ΡˆΠΈΡ… интСрфСйсных классах, Ρ‚ΠΎ ΠΎΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Ρ‰ΠΈΡ‰Π΅Π½ΠΎ ΠΎΡ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, вносимых Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΡ… Β«ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Ρ…Β» рСструктуризации. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², Ρ€Π°Π±ΠΎΡ‚Π° Π½Π°Π΄ интСрфСйсом (интСрфСйсными классами) с ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ° ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ сущСствСнно ΠΏΠΎΠ½ΠΈΠ·ΠΈΡ‚ΡŒ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ слоТности ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования. Π˜Ρ‚Π°ΠΊ, рассмотрим ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅, ΠΊΠ°ΠΊΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ интСрфСйсных классов ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ°.