есто того, чтобы порождать нов

Автор admin Суббота, 27 июня 2009 11:32

есто того, чтобы порождать новый поток для каждой задачи). //: Cll:TestTQueue.cpp {RunByHand} //{L} ZThread linclude linclude linclude “TQueue.h” linclude “zthread/Thread.h” linclude “LiftOff.h” using namespace ZThread: using namespace std: class LiftOffRunner : public Runnable { Учтите, что если потребители по каким-то причинам прекратят свою работу, то поставщик будет выдавать новые объекты до исчерпания свободной памяти в системе. Чтобы этого не произошло, можно включить в программу ограничение на максимальное количество элементов и организовать блокировку поставщиков при переполнении очереди. 578 Глава 11 • Многопоточное программирование TQueue rockets; public: void add(LiftOff* lo) { rockets.put(1o); } void runО { try { while(!Thread::interrupted()) { LiftOff* rocket = rockets.getO; rocket->run(): } } catch(Interrupted_Exception&) { /* Exit */ } cout « “Exiting LiftOffRunner” « endl: } int mainO { try { LiftOffRunner* lor = new LiftOffRunner; Thread t(lor); for(int i = 0; i < 5; i++) lor->add(new LiftOff(10. i)): cin.getO; lor->add(new LiftOff(10. 99)): cin.getO; t. i

Подробнее

class TQueue { ZThread::Mutex

Автор admin Суббота, 27 июня 2009 11:32

class TQueue { ZThread::Mutex lock: ZThread:Condition cond: std::deque data: public: TQueueО : cond(lock) {} void put(T item) { ZThread::Guard g(lock); data.push_back(itern); cond.signal О: } T get О { ZThread::Guard g(lock); while(data. emptyO) cond.waitO: T returnVal = data.frontO: data.pop_front(); return returnVal: } lendif // TQUEUEJ ///:- Шаблон строится на базе контейнера deque из стандартной библиотеки С++ и дополняет его двумя новыми возможностями. • Синхронизация гарантирует, что два программных потока не будут одновременно добавлять объекты в дек. • Вызовы wait() и signal() обеспечивают автоматическую приостановку потребителей при пустой очереди и их активизацию при появлении новых элементов. Этот относительно небольшой фрагмент кода решает на удивление много проблем1. В следующей простой тестовой программе организуется последовательная обработка объектов Liftoff. Потребителем является объект LiftOffRunner, который извлекает объекты LiftOff из контейнера TQueue и запускает их напрямую (то есть использует собственный программный поток прямым вызовом run() вм

Подробнее

al() для активизации программн

Автор admin Суббота, 27 июня 2009 11:32

al() для активизации программного потока. Этот пример отличается от предыдущего тем, что в нем (по крайней мере, на концептуальном уровне) производятся объекты («тосты»). Частота создания объектов подвержена случайным отклонениям, чтобы в работе программы участвовал фактор неопределенности. Но при запуске выясняется, что автомат не работает, потому что многие тосты так и остаются в своем исходном виде: не намазываются ни маслом, ни джемом. Решение проблем многопоточности с помощью очередей Многие проблемы многопоточности связаны с необходимостью последовательного выполнения задач. Программа ToastOMatic.cpp должна не только последовательно обрабатывать создаваемые тосты, но и работать с одним тостом, не беспокоясь о том, что следующий тост тем временем упадет на пол. Нередко проблему удается решить использованием очереди с синхронизированным доступом к элементам: //: Cll:TQueue.h #i fndef TQUEUE_H #define TQUEUE_H #i nclude #include “zthread/Thread.h” #include “zthread/Condition.h” Кооперация между программными потоками 577 linclude “zthread/Mutex.h” linclude “zthread/Guard.h” tempiate

Подробнее

Автор Среда, 1 апреля 2009 11:32

Подробнее