void run() { try { while(IThr
Автор admin Суббота, 27 июня 2009 11:32
void run() { try { while(IThread::interrupted()) { // Блокировка до появления следующего тоста: Toast t = dryQueue->get(): t.butterO; cout « t « endl; butteredQueue->put(t); } } catch(Interrupted_Exception&) { /* Exit */ } cout « “Butterer off” « endl; } 580 Глава 11 • Многопоточное программирование }: // Нанесение джема на тост с маслом: class Jammer : public Runnable { ToastQueue butteredQueue. finishedQueue: public: Jammer(ToastQueue& buttered, ToastQueueS finished) : butteredQueue(buttered). finishedQueue(finished) {} void run() { try { while(!Thread::interrupted()) { // Блокировка до появления следующего тоста: Toast t = butteredQueue->get(): t.jamO: cout « t « endl: finishedQueue->put(t): } } catch(Interrupted_Exception&) { /* Exit */ } cout « “Jammer off” « endl: } // Потребление тоста: class Eater : public Runnable { ToastQueue finishedQueue: int counter: public: Eater(ToastQueue& finished) : finishedQueueCfinished). counter(O) {} void run() { try { while( IThread::interruptedO) { // Блокировка до появления следующего тоста: Toast t = finishedQueue->get(): // Убеждаемся в том, что тосты следу
Подробнееммными потоками 579 Toast О
Автор admin Суббота, 27 июня 2009 11:32
ммными потоками 579 Toast О { assert(O): } // Никогда не должен вызываться #endif void butterO { status = BUTTERED: } void jam() { status = JAMMED; } string getStatusO const { switch(status) { case DRY: return “dry”; case BUTTERED: return “buttered”: case JAMMED: return “jammed”; default: return “error”; } } int getldO { return id: } friend ostream& operator«(ostream& os, const Toast& t) { return os « “Toast ” « t.id « “: ” « t.getStatusO: } }: typedef CountedPtr< TQueue
nter ruptO: } catch(Synchroniz
Автор admin Суббота, 27 июня 2009 11:32
nter ruptO: } catch(Synchronization_Exception& e) { cerr « e.whatO « endl: } } ///:- Задачи помещаются в контейнер TQueue в функции main() и извлекаются из него в LiftOffRunner. Стоит отметить, что LiftOffRunner может игнорировать проблемы синхронизации, так как они решаются в TQueue. Чтобы решить проблему в программе ToastOMatic.cpp, можно организовать хранение тостов в контейнере TQueue между процессами. А для этого нам понадобятся «полноценные» объекты тостов, способные хранить и выводить свое состояние: //: Cl1:ToastOMaticMark11.cpp {RunByHand} // Решение проблем с использованием TQueue. //{L} ZThread #i nclude
Последние комментарии