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

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

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

set<long> SuggestionForElective;

courses Schedule; courses DegreePlan;

public:

blackboard(void); ~blackboard(void);

void suggestionsForMajor(const courses &X);

void suggestionsForMinor(const courses &X);

void suggestionsForGeneral(const courses &X);

void suggestionsForElectives(const courses &X);

courses *currentDegreePlan(void);

courses *suggestedSchedule(void);

//. . .

} ;

Π­Ρ‚ΠΎΡ‚ класс Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для прСдоставлСния Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Ρ… Π² интСрфСйсном классС. Помимо Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ Π½Π΅ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π² качСствС интСрфСйса. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ класс Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ black_board, прСдставлСнный Π² листингС 13.2, наслСдуСт нСпосрСдствСнно Π½Π΅ интСрфСйсный класс black_board, Π° класс POA_black_board, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Ρ‚Π΅Ρ… классов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ создаСт IDL-компилятор ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ интСрфСйсного класса black_board. ОбъявлСниС класса POA_black_board ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ Π² листингС 13.3.

// Листинг 13.3. Π€Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ объявлСния класса POA_black_board,

// созданного idl-компилятором для

// интСрфСйсного класса black_board

class POA_black_board : virtual public PortableServer::StaticImplementation

{

public:

virtual -POA_black_board (); black_board_ptr _this ();

bool dispatch (CORBA::StaticServerRequest_ptr); virtual void invoke (CORBA::StaticServerRequest_ptr); virtual CORBA::Boolean _is_a (const char *); virtual CORBA::InterfaceDef_ptr _get_interface (); virtual CORBA::RepositoryId _primary_interface

(const PortableServer::ObjectId &, PortableServer::POA_ptr);

virtual void * _narrow_helper (const char *); static POA_black_board * _narrow (

PortableServer::Servant); virtual CORBA::Object_ptr _make_stub (PortableServer::

POA_ptr,

CORBA::Object_ptr);

//.. .

virtual void suggestionsForMajor (const courses& Major)

= 0;

virtual void suggestionsForMinor (const courses& Minor)

= 0;

virtual void suggestionsForGeneral (

const courses& General) = 0;

virtual void suggestionsForElectives (

const courses& Electives) = 0;

virtual courses* currentDegreePlan() = 0;

virtual courses* suggestedSchedule() = 0;

//. . . protected:

POA_black_board () {}; private:

POA_black_board (const POA_black_board &); void operator= (const POA_black_board &);

};

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ класс Π² листингС 13.3 являСтся абстрактны ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ содСрТит чисто Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹, Π½Π°ΠΏΡ€ΠΈ ΠΌ Π΅Ρ€:

virtual courses* suggestedSchedule() = 0;

Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹ΠΉ класс нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ напря ΠΌ ΡƒΡŽ. Из Π½Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈ ΠΌ ΠΎ вывСсти ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ класс, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎ ΠΌ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ для всСх объявлСний чисто Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Класс POA_black_board, прСдставлСнный Π² листингС 13.2, содСрТит Ρ‚Ρ€Π΅Π±ΡƒΠ΅ ΠΌ Ρ‹Π΅ опрСдСлСния для всСх чисто Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ². Π§Ρ‚ΠΎ касаСтся нашСго класса «классной доски*', Ρ‚ΠΎ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ дСйствий са ΠΌ ΠΎΠΉ «доски» ΠΈ источников Π·Π½Π°Π½ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π‘ ++-ΠΌ Π΅Ρ‚ΠΎΠ΄Ρ‹. Однако источники Π·Π½Π°Π½ΠΈΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ частично Π² языкС Π‘++ ΠΈ частично Π² языкС логичСского ΠΏΡ€ΠΎ Π³ Ρ€Π° ΠΌΠΌ ирования Prolog. [24] Но ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π‘++ ΠΏΠΎΠ΄ Π΄ Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΡΠ·Ρ‹ΠΊΠΎΠ²ΡƒΡŽ ΠΈ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ, ΠΊ срСдствам Π‘++ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ достоинства языка Prolog. Π’ Π‘++ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π»ΠΈΠ±ΠΎ ΠΏΠΎΡ€ΠΎΠ΄ΠΈΡ‚ΡŒ Prolog-Π·Π°Π΄Π°Ρ‡ΠΈ (с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ posix_spawn() - ΠΈΠ»ΠΈ fork-exec-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ), Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ срСдС Prolog Ρ‡Π΅Ρ€Π΅Π· Π΅Π΅ интСрфСйс с Π½Π΅Π·Π½Π°ΠΊΠΎΠΌΡ‹ΠΌΠΈ языками программирования, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Prolog-срСдС ΠΎΠ±Ρ‰Π°Ρ‚ΡŒΡΡ нСпосрСдствСнно с Π‘++ ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚. НСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π½Π° ΠΊΠ°ΠΊΠΎΠΌ языкС создана рСализация источников Π·Π½Π°Π½ΠΈΠΉ β€” Π‘++ ΠΈΠ»ΠΈ Prolog, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ «классной доски» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Π‘++-ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ.

ΠŸΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ источников Π·Π½Π°Π½ΠΈΠΉ Π² конструкторС «классной доски»

«Классная доска» рСализуСтся ΠΊΠ°ΠΊ распрСдСлСнный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ CORBA-ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ». Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· основных Ρ†Π΅Π»Π΅ΠΉ «классной доски» являСтся ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ источников Π·Π½Π°Π½ΠΈΠΉ. Π­Ρ‚ΠΎ Π²Π°ΠΆΠ½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ «классная доска» Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅Ρ‚ΡŒ доступ ΠΊ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌ Π·Π°Π΄Π°Ρ‡. ΠΠ°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ состояниС «классной доски» (ΠΎΠ½ΠΎ устанавливаСтся Π² конструкторС) Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ студСнтС, Π΅Π³ΠΎ акадСмичСской характСристикС, Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ сСмСстрС, трСбованиях для получСния Π΄ΠΈΠΏΠ»ΠΎΠΌΠ° ΠΈ Ρ‚.Π΄. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ «классной доски», исходя ΠΈΠ· Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ состояния, опрСдСляСтся, ΠΊΠ°ΠΊΠΈΠ΅ источники Π·Π½Π°Π½ΠΈΠΉ слСдуСт Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π² Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π˜Π½Π°Ρ‡Π΅ говоря, ΠΎΡ†Π΅Π½ΠΈΠ² Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ ΠΈ исходноС состояниС систСмы, «классная доска» составляСт список запускаСмых Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ источников Π·Π½Π°Π½ΠΈΠΉ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ источник Π·Π½Π°Π½ΠΈΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», Π° для хранСния ΠΈΠΌΠ΅Π½ этих Ρ„Π°ΠΉΠ»ΠΎΠ² «классная доска» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Solvers. ПозТС, ΠΏΡ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ конструктора, с ΠΏΠΎ ΠΌ ΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ) ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° for_each() ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‚ΡΡ источники Π·Π½Π°Π½ΠΈΠΉ. ВспомнитС, Ρ‡Ρ‚ΠΎ любой класс, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° опСраторная функция operator(), ΠΌ ΠΎΠΆ Π½ ΠΎ испо Π» ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈ Π» ΠΎ ΠΏΡ€ΠΈ ΠΌ Π΅Π½ΡΡŽΡ‚ сов ΠΌ Сстно со стандартны ΠΌ ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ ΠΌ Π° ΠΌ ΠΈ Π² ΠΌ Ссто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Π» ΠΈ Π² Π΄ΠΎΠΏΠΎ Π» Π½Π΅Π½ΠΈΠ΅ ΠΊ Π½ΠΈ ΠΌ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ ΠΌ ΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π΅Π΅ ΠΌ ΠΎΠΆΠ½ΠΎ Π·Π° ΠΌ Π΅Π½ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎ ΠΌ -Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ собствСнный Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈ ΠΌ ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ ΠΌ Π΅Ρ‚ΠΎΠ΄ operator (), ΠΏΡ€ΠΈΠ΄Π°Π² Π΅ ΠΌ Ρƒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ с ΠΌ ысл, ΡƒΠΊΠ°Π·Π°Π² список ΠΏΠ°Ρ€Π° ΠΌ Π΅Ρ‚Ρ€ΠΎΠ² ΠΈ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ ΠΌ ΠΎΠ³ΠΎ ΠΈ ΠΌ значСния. Наша CORBA-рСализация «классной доски» ΠΌ ΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄ Π΄ Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ источники Π·Π½Π°Π½ΠΈΠΉ, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ с ΠΏΠΎ ΠΌ ΠΎΡ‰ΡŒΡŽ PVM-Π·Π°Π΄Π°Ρ‡, Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… UNDC/Linux-Π·Π°Π΄Π°Ρ‡ ΠΈΠ»ΠΈ ΠΎΡ‚ Π΄ Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ POSIX thread. По Ρ‚ΠΈΠΏΡƒ Π·Π°Π΄Π°Ρ‡, ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅ ΠΌ Ρ‹Ρ… Π² конструкторС, ΠΌ ΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, с ΠΊΠ°ΠΊΠΈ ΠΌ ΠΈ ΠΈ ΠΌ Π΅Π½Π½ΠΎ Π·Π°Π΄Π°Ρ‡Π° ΠΌ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ «классная доска»: с POSIX-ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΌ ΠΈ, Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ ΠΌ ΠΈ UNIX/Linux-процСсса ΠΌ ΠΈ ΠΈΠ»ΠΈ PVM-Π·Π°Π΄Π°Ρ‡Π° ΠΌ ΠΈ.

ΠŸΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ источников Π·Π½Π°Π½ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ PVM-Π·Π°Π΄Π°Ρ‡

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ «классной доски» содСрТит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ² Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°, for_each(Solve.begin(),Solve.end(), Task);

Алгоритм for_each () примСняСт ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (созданного для класса Π·Π°Π΄Π°Ρ‡ΠΈ) ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ элСмСнту ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Solve. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для пороТдСния источников Π·Π½Π°Π½ΠΈΠΉ Π² соотвСтствии с модСлью MIMD, ΠΏΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ всС источники Π·Π½Π°Π½ΠΈΠΉ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΡƒΡŽ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. ОбъявлСниС этого класса Π·Π°Π΄Π°Ρ‡ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ Π² листингС 13.4.

// Листинг 13.4. ОбъявлСниС класса Π·Π°Π΄Π°Ρ‡ΠΈ

class task{

int Tid[4];

int N;

//. . .

public:

//. . .

task(void) { N = 0; } void operator()(string X);

};

void task::operator()(string X) {

int cc; pvm_mytid();

cc = pvm_spawn(const_cast<char *>(X.data()),NULL,0,"",l,&Tid[N]);

N++;

}

blackboard::blackboard(void) {

task Task;

vector<string> Solve;

//.. .

// Determine which KS to invoke

//. . .

Solve.push_back(KS1);

Solve.push_back(KS2);

Solve.push_back(KS3);

Solve.push_back(KS4);

for_each(Solve.begin(), Solve.end(), Task);

}

Π­Ρ‚ΠΎΡ‚ класс task инкапсулируСт ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½Π½Ρ‹ΠΉ процСсс. Он содСрТит ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Π½ΠΎ ΠΌ Π΅Ρ€ Π·Π°Π΄Π°Ρ‡ΠΈ (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ нас ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ PVM-Π·Π°Π΄Π°Ρ‡Π°). Π’ случаС ΠΏΡ€ΠΈ ΠΌ СнСния стандартных UNDC/Linux-процСссов ΠΈΠ»ΠΈ Pthread-ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Π½ΠΎ ΠΌ Π΅Ρ€ процСсса ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π­Ρ‚ΠΎΡ‚ класс дСйствуСт ΠΊΠ°ΠΊ интСрфСйс ΠΌΠ΅ΠΆΠ΄Ρƒ создаваСмым процСссом ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΈ «классной доской». «Классная доска» здСсь являСтся основным ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ управлСния. Она ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ PVM-Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΈΡ… ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ². ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, «классная доска» ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³Ρ€ΡƒΠΏΠΏΠΎΠ²Ρ‹Π΅ PVM-ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ для синхронизации PVM-Π·Π°Π΄Π°Ρ‡ с использованиСм Π±Π°Ρ€ΡŒΠ΅Ρ€ΠΎΠ², ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ PVM-Π·Π°Π΄Π°Ρ‡ Π² логичСскиС Π³Ρ€ΡƒΠΏΠΏΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ аспСкты Ρ€Π΅ΡˆΠ°Π΅ΠΌΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΈ сигнализации Ρ‡Π»Π΅Π½ΠΎΠ² Π³Ρ€ΡƒΠΏΠΏΡ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ‚Π΅Π³ΠΎΠ² сообщСний. Π“Ρ€ΡƒΠΏΠΏΠΎΠ²Ρ‹Π΅ PVM-ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ пСрСчислСны ΠΈ описаны Π² Ρ‚Π°Π±Π». 13.2.