Listing 5: Example of test program
#include <kfThread.h>
#include "list.h"
// pool of resources
list pool;
//---------------------------------------------
// producer class
//
class producer: public CKFMT::CRunnable {
public:
producer(long howmany, list *lst);
void run();
private:
long m_max;
list *m_lst;
};
producer::producer(long howmany, list *lst)
{
m_max = howmany;
m_lst = lst;
}
void
producer::run()
{
for(int i=0; i < m_max; i++) {
long *rs = new long;
*rs = i;
m_lst->insert((void *)rs);
for(int j=0; j < 3000; j++);
}
cerr << "Produced " << m_max << " resources.\n";
}
//---------------------------------------------
// consumer class
//
class consumer : public CKFMT::CRunnable {
public:
consumer(list *lst);
void run();
long count() { return m_count; };
private:
list *m_lst;
long m_count;
};
consumer::consumer(list *lst)
{
m_lst = lst;
m_count = 0;
}
void
consumer::run()
{
for(;;) {
long *rv = (long *)m_lst->get();
if (rv == NULL) {
cerr << "Consumed " << m_count << " resources.\n";
return;
}
else {
delete rv;
m_count++;
if ((m_count % 50) == 0)
cerr << "Consumed " << m_count << " resources.\n";
}
}
}
int
main(int argc, char **argv)
{
// start consumer
consumer *con = new consumer(&pool);
con->increment();
CKFMT::CThread *cont = new CKFMT::CThread(con);
cont->make_runnable();
// start 2 producers
// start producer # 1
producer *prod1 = new producer(200, &pool);
prod1->increment();
CKFMT::CThread *prodt1 = new CKFMT::CThread(prod1);
prodt1->make_runnable();
// start producer #2
producer *prod2 = new producer(100, &pool);
prod2->increment();
CKFMT::CThread *prodt2 = new CKFMT::CThread(prod2);
prodt2->make_runnable();
prod1->wait_for_completion();
prod2->wait_for_completion();
con->wait_for_completion();
}
//End of File