// class ACE_Task : public ACE_Task_Base
# This is an example on how to implement a ACE thread pool.
#:cat t.C
#include "ace/Synch.h"
#include "ace/Synch_T.h"
#include "ace/Activation_Queue.h"
#include "ace/Method_Request.h"
#include "ace/OS.h"
#include "ace/Task.h"
#include "ace/Activation_Queue.h"
#include "ace/Method_Request.h"
#include "ace/Synch.h"
class Task: public ACE_Method_Request
{
public:
Task(int a):i(a) {};
virtual ~Task() {};
public:
virtual int call() {printf("%d/n",i);return 0;}
public:
int i;
};
class ThreadPool: public ACE_Task<ACE_MT_SYNCH>
{
public:
ThreadPool(int thread): mStatusRunning(false),mServerThreads(thread) {
mQueue=new ACE_Activation_Queue(/*this->msg_queue()*/);
}
/** Start thread pool */
int start(void *)
{
if (!mStatusRunning) {
activate(THR_NEW_LWP|THR_JOINABLE|THR_CANCEL_ENABLE|THR_CANCEL_ASYNCHRONOUS,
mServerThreads);
mStatusRunning = true;
}
return 0;
}
/** Stop thread pool */
int stop()
{
mStatusRunning = false;
return 0;
}
/** Add a task */
int addTask(Task *task)
{
if (task != NULL)
mQueue->enqueue(task);
return 0;
}
int svc(void)
{
while(mStatusRunning)
{
if (!mQueue->is_empty())
{
std::auto_ptr<ACE_Method_Request> mo(this->mQueue->dequeue());
if (mo->call() == -1)
{
printf("error/n");
}
sleep(1);
}
}
return 0;
}
private:
ACE_Activation_Queue *mQueue;
ACE_Thread_Mutex mAuditMutex;
private:
int mServerThreads;
bool mStatusRunning;
};
int main(int argc, char *argv[])
{
ThreadPool *pool = new ThreadPool(2);
pool->start(NULL);
pool->addTask(new Task(1));
pool->addTask(new Task(2));
pool->addTask(new Task(3));
pool->addTask(new Task(4));
pool->addTask(new Task(5));
printf("Before sleeping...");
sleep(5);
printf("After sleeping...");
}
/#:> cat Makefile
ACE_ROOT = .../vendor/Corba/ACE_TAO
CCFLAGS += -DACE_HAS_EXCEPTIONS -DSUN_CC_HAS_PVFC_BUG -D__ACE_INLINE__ -DACE_HAS_IPV6
LDFLAGS =
ACE_LIBS = -lACE
all: task
task: task.o
CC $(CCFLAGS) -L$(ACE_ROOT)/lib $(ACE_LIBS) -o $@ $^
%.o: %.C
CC -c $(CCFLAGS) -I$(ACE_ROOT)/include -I$(ACE_ROOT)/include/ace -o $@ $^