|
Программирование >> Разработка устойчивых систем
#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:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |