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

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

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

Command.append("/tmp/");

Command.append(X);

char *const argv[] = {const_cast<char*>(Command.data()),NULL};

posix_spawn(&Pid,Command.data(),&N,&M,argv,NULL);

Command.erase(Command.begin(), Command.end()); //.. .

}

ΠœΡ‹ инкапсулируСм Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ posix_spawn() , Π² классС child_process. Π˜Π½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡ всСх Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Ρ… для Π²Ρ‹Π·ΠΎΠ²Π° этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² классС, ΡƒΠΏΡ€ΠΎ Ρ‰ Π°Π΅Ρ‚ Π΅Π΅ использованиС ΠΈ обСспСчиваСт СстСствСнный интСрфСйс с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ процСсса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСтся с Π΅Π΅ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² классС child_process ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ operator () (см. листинг 13.9). Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ класс child_process ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° for__each (). По ΠΌΠ΅Ρ€Π΅ Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ «классная доска» Ρ€Π΅ΡˆΠ°Π΅Ρ‚, ΠΊΠ°ΠΊΠΈΠ΅ источники Π·Π½Π°Π½ΠΈΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΎΠ½Π° сохраняСт ΠΈΡ… ΠΈΠΌΠ΅Π½Π° Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ Solve. ПозТС ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ конструктора «классной доски» Π½ΡƒΠΆΠ½Ρ‹Π΅ источники Π·Π½Π°Π½ΠΈΠΉ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° for_each ().

// ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€.

//...

child_process Task;

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

ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ этого конструктора для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Solve вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ operator (), ΠΊΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 13.9. ПослС Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ источники Π·Π½Π°Π½ΠΈΠΉ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ доступ ΠΊ ссылкС Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ «классной доски» ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ свой части Π·Π°Π΄Π°Ρ‡ΠΈ. И хотя источники Π·Π½Π°Π½ΠΈΠΉ здСсь Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ PVM-Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ, ΠΎΠ½ΠΈ ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ΡΡ с «классной доской» Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ способом (см. ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π» 13.5.3.2) ΠΈ Ρ‚Π°ΠΊ ΠΆΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ мСТпроцСссноС взаимодСйствиС ΠΌΠ΅ΠΆΠ΄Ρƒ стандартными UNIX/Linux-процСссами отличаСтся ΠΎΡ‚ мСТпроцСссного взаимодСйствия, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ с использованиСм PVM-срСды. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, PVM-Π·Π°Π΄Π°Ρ‡ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°Ρ…, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ процСссы, созданныС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ posix_spawn(), ΠΌΠΎΠ³ΡƒΡ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅. Если процСссы, созданныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ posix_spawn() (Π»ΠΈΠ±ΠΎ сСмСйством Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ fork-exec), Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² сочСтании с модСлью SIMD, Ρ‚ΠΎ Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ «классной доски» для назначСния источникам Π·Π½Π°Π½ΠΈΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… областСй Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ argc ΠΈ argv. Π’ случаС, ΠΊΠΎΠ³Π΄Π° «классная доска» находится Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ с источниками Π·Π½Π°Π½ΠΈΠΉ, ΠΈ ΠΎΠ½Π° Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ источники Π·Π½Π°Π½ΠΈΠΉ Π² своСм конструкторС, Ρ‚ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ «классная доска» являСтся для Π½ΠΈΡ… Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ, Π° ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΈ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΎΡ‚ родитСля ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды «классной доски» ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ способа ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ источникам Π·Π½Π°Π½ΠΈΠΉ. Π­Ρ‚ΠΈΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ срСды ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

#include <stdlib.h>

//.. .

setenv();

unsetenv();

putenv();

Если источники Π·Π½Π°Π½ΠΈΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ Π² процСссах, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ созданы с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ posix_spawn () (ΠΈΠ»ΠΈ fork-exec), Ρ‚ΠΎ ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ CORBA-программирования с доступом ΠΊΠΎ всСх срСдствам, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹ΠΌ CORBA-ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ.

РСализация ΠΌΠΎΠ΄Π΅Π»ΠΈ «классной доски» с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

Π’Ρ‹Π±ΠΎΡ€ CORBA-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ «классной доски» Π²ΠΏΠΎΠ»Π½Π΅ СстСствСн Π² условиях, ΠΊΠΎΠ³Π΄Π° источники Π·Π½Π°Π½ΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² срСдС intranet ΠΈΠ»ΠΈ Internet, ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° Π² цСлях соблюдСния ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ, инкапсуляции ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ источник Π·Π½Π°Π½ΠΈΠΉ рСализуСтся Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ процСссС. Однако Π² распрСдСлСнии «классной доски» Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π΅ всСгда. Если источники Π·Π½Π°Π½ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса ΠΈΠ»ΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ всСго Π² этом случаС ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ быстродСйствиС Π²Ρ‹ΡˆΠ΅, расходы систСмных рСсурсов мСньшС, Π° сама Ρ€Π°Π±ΠΎΡ‚Π° (настройка) β€” ΠΏΡ€ΠΎΡ‰Π΅. ВзаимодСйствиС ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π»Π΅Π³Ρ‡Π΅ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΡ‚ΠΎΠΊΠΈ Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ ΠΎΠ΄Π½ΠΎ адрСсноС пространство ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅. Π’Π΅Π΄ΡŒ Ρ‚ΠΎΠ³Π΄Π° Β«ΠΊΠ»Π°ΡΡΠ½ΡƒΡŽ доску» ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, доступный всСм ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ Π² процСссС. ΠŸΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ источников Π·Π½Π°Π½ΠΈΠΉ Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΡ‚ΠΏΠ°Π΄Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π² мСТпроцСссном взаимодСйствии, использовании сокСтов ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° сСтСвой связи. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² этом случаС оказываСтся Π½Π΅Π½ΡƒΠΆΠ½Ρ‹ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ CORBA-ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… C++-классов. Если многопоточная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° рассчитана Π½Π° использованиС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° с нСсколькими процСссорами, Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Π½Π° доступных процСссорах. Π’ SMP- ΠΈ МРР-систСмах потоковая конфигурация «классной доски» вСсьма ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½Π°. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС ΠΏΡ€ΠΈ использовании ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² достигаСтся самая высокая ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. ΠŸΠΎΡ‚ΠΎΠΊΠΈ часто Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΎΠ±Π»Π΅Π³Ρ‡Π΅Π½Π½Ρ‹ΠΌΠΈ процСссами, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Ρ‚Π°ΠΊΠΈΡ… ΠΆΠ΅ расходов систСмных рСсурсов, ΠΊΠ°ΠΊ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ UNIX/Linux-процСссы. Π’ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ POSIX threads (Pthreads) прСдусмотрСно практичСски всС, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ для создания источников Π·Π½Π°Π½ΠΈΠΉ ΠΈ управлСния ΠΈΠΌΠΈ. На рис. 13.7.1-13.7.3 прСдставлСны Ρ‚Ρ€ΠΈ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ распрСдСлСния процСссов для «классной доски» ΠΈ источников Π·Π½Π°Π½ΠΈΠΉ.

Рис. 13.7. Базовая конфигурация распрСдСлСния процСссов для «классной доски» ΠΈ источников Π·Π½Π°Π½ΠΈΠΉ

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ «классная доска» Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ срСдС, Ρ‚ΠΎ для синхронизации доступа ΠΊ «классной доскС» ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Pthread-ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΡ‹ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ условий, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² интСрфСйсных классах, ΠΊΠ°ΠΊ описано Π² Π³Π»Π°Π²Π΅ 11. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, для ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΈ синхронизации Ρ€Π°Π±ΠΎΡ‚Ρ‹, выполняСмой источниками Π·Π½Π°Π½ΠΈΠΉ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_cond_signal () ΠΈ pthread_cond_broadcast (). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ «классная доска» сама создаСт ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Π΅ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌ всСх источников Π·Π½Π°Π½ΠΈΠΉ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ «классная доска» ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈ нСобходимости Π°Π½Π½ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pthread_cancel (). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, «классная доска» способна ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ источников Π·Π½Π°Π½ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ pthread_join(). Помимо ΡƒΠΆΠ΅ пСрСчислСнных достоинств ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (высокоС быстродСйствиС ΠΈ простота использования ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ глобального ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° «классной доски»), сущСствуСт Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ситуаций.

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΡ€ΠΎΡ‰Π΅ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ процСсса ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈ использовании Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… процСссов ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠ². На рис. 13.8 ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ ΡƒΡ€ΠΎΠ²Π½ΠΈ слоТности, связанныС с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ ошибок ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ситуаций ΠΏΡ€ΠΈ использовании Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ.

Рис. 13.8. Π£Ρ€ΠΎΠ²Π½ΠΈ слоТности ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ошибок ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

Если источники Π·Π½Π°Π½ΠΈΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ процСсса, Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ошибок ΠΈΠ»ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ситуаций Π² этом случаС относится ΠΊ ΡƒΡ€ΠΎΠ²Π½ΡŽ слоТности 2. Π­Ρ‚Ρƒ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ слоТности Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ Π½Π° этапах проСктирования ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, особСнно Π² случаС, Ссли ΠΎΠ½Π° Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования. ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅Π΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π΅ модСль «классной доски», состоит Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ «классной доски» Π² Π²ΠΈΠ΄Π΅ глобального ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π° источников Π·Π½Π°Π½ΠΈΠΉ β€” Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Рассмотрим Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ объявлСния класса blackboard.

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

//Β Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ³ΠΎ для ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ срСды

class blackboard{ protected: //.. .

set<long> SuggestionForMajor;