Программирование >>  Разработка устойчивых систем 

1 ... 184 185 186 [ 187 ] 188 189 190 ... 196


#1псТ ude Zthread/ThreadedExecutor.h #include TQueue.h using namespace ZThread; using namespace std:

class Car { int id;

bool engine. driveTrain. wheels; public:

Car(int idn) : id(idn). engine(false). driveTrain(false). wheels(false) {} Пустой объект Саг: СагО : id(-l). engine(false). driveTrain(false). wheels(false) {} Функции не синхронизируются -- предполагается. что операции bool атомарны, int getldO { return id: } void addEngineO { engine = true; } bool enginelnstalledO { return engine: } void addDriveTrainO { driveTrain = true; } bool driveTrainlnstalledO { return driveTrain; } void addWheelsO { wheels = true; } bool wheelsInstalledO { return wheels; } friend ostreamS operator (ostreamS os. const Car& c) { return OS Car c.id [

engine: c.engine

driveTrain: c.driveTrain

wheels: c.wheels ] :

typedef CountedPtr< TQueue<Car> > CarQueue:

class ChassisBuilder : public Runnable {

CarQueue carQueue:

int counter; public:

ChassisBuilder(CarQueue& cq) : carQueue(cq).counter(O) {} void runO { try {

whileCIThread::interrupted()) { Thread::sieep(1000); Создание рамы: Саг c(counter++); cout с endl; Постановка рамы в очередь carQueue->put(c);

} catch(Interгupted Exception&) { /* Exit */ } cout ChassisBuilder off endl:

class Cradle { Car c: Машина, собираемая в данный момент bool occupied; Mutex workLock. readylock; Condition workCondition. readyCondition: bool engineBotHired. wheelBotHired, driveTrainBotHired:



public: CradleO

: workCondition(workLock). readyCondition(readyLock) { occupied = false: engineBotHired = true: wheelBotHired = true: driveTrainBotHired = true:

void insertCar(Car chassis) { с = chassis: occupied = true:

Car getCarO { Выборка производится только один раз if(!occupied) { cerr No Car in Cradle for getCarO endl: return CarO: Пустой объект Car

occupied = false: return c:

Обращение к машине на монтажном стенде: Саг* operator->() { return &с: } Для предложения роботами своих услуг: void offerEngineBotServicesC) {

Guard<Mutex> g(workLock):

wh i1e(eng i neBotH i red) workCondition.waitO:

engineBotHired = true: Принять задание

void offerWheelBotServicesO { Guard<Mutex> g(workLock): whileCwheelBotHired)

workCondition.waitO: wheelBotHired = true: Принять задание

void offerDriveTrainBotServicesC) { Guard<Mutex> g(workLock): wh i1e(dri veTra i nBotHi red)

workCondition.waitC): driveTrainBotHired = true: Принять задание

Оповещение ожидающих роботов о наличии работы: void startWorkO {

Guard<Mutex> g(workLock):

engineBotHired = false:

wheelBotHired = false:

driveTrainBotHired = false:

workCondition.broadcast():

Каждый робот сообщает о выполнении своей задачи: void taskFinishedO {

Guard<Mutex> g(readyLock):

readyCond i t i on.s i gna1():

Director ждет, пока будут завершены все задачи: void waitUntilWorkFinishedO { Guard<Mutex> g(readyLock):

while(!(c.enginelnstalled() && c.driveTrainlnstalledO && c.wheelsInstalledO))



class DriveTrainRobot : public Runnable {

CradlePtr cradle: public:

DriveTrainRobot(CradlePtr cr) ; cradle(cr) {} void runO { try {

while(IThread::interrupted()) { Блокировка до предложения/принятия задачи: cradle->offerDriveTrainBotServices(): cout Installing DriveTrain endl: (*cradle)->addDriveTrain(): cradle->taskFinished():

readyCondition.waU():

typedef CountedPtr<Crad1e> CradlePtr:

class Director : public Runnable {

CarQueue chassisQueue, finishingQueue:

CradlePtr cradle: public;

Director(CarQueue& cq. CarQueueS fq. CradlePtr cr) : chassisQueue(cq). finishingQueue(fq). cradle(cr) {} void runO { try {

while(IThread::interrupted()) { Блокировка до появления рамы: cradle->i nsertCar(chassi sQueue->get()): Оповещение роботов о наличии работы: cradle->startWork(): Ожидание завершения работы cradle->waitUnti1WorkFinished(): Включение машины в очередь для продолжения работы fi ni Shi ngQueue->put(cradle->getCar()):

} catch(Interrupted Exception&) { /* Выход */ } cout Director off endl:

class EngineRobot : public Runnable {

CradlePtr cradle: public:

EngineRobot(CradlePtr cr) : cradle(cr) {} void runO { try {

while(IThread::interrupted()) { Блокировка до предложения/принятия задачи: cradle->offerEngineBotServices(): cout Installing engine endl: (*cradle)->addEngine(): cradle->taskFinished():

} catch(Interrupted Exception&) { /* Exit */ } cout EngineRobot off endl:



1 ... 184 185 186 [ 187 ] 188 189 190 ... 196

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика