123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- // Copyright (c) 2006- Facebook
- // Distributed under the Thrift Software License
- //
- // See accompanying file LICENSE or visit the Thrift site at:
- // http://developers.facebook.com/thrift/
- #ifndef _THRIFT_CONCURRENCY_THREADMANAGER_H_
- #define _THRIFT_CONCURRENCY_THREADMANAGER_H_ 1
- #include <boost/shared_ptr.hpp>
- #include <sys/types.h>
- #include "Thread.h"
- namespace facebook { namespace thrift { namespace concurrency {
- /**
- * Thread Pool Manager and related classes
- *
- * @author marc
- * @version $Id:$
- */
- class ThreadManager;
- /**
- * ThreadManager class
- *
- * This class manages a pool of threads. It uses a ThreadFactory to create
- * threads. It never actually creates or destroys worker threads, rather
- * It maintains statistics on number of idle threads, number of active threads,
- * task backlog, and average wait and service times and informs the PoolPolicy
- * object bound to instances of this manager of interesting transitions. It is
- * then up the PoolPolicy object to decide if the thread pool size needs to be
- * adjusted and call this object addWorker and removeWorker methods to make
- * changes.
- *
- * This design allows different policy implementations to used this code to
- * handle basic worker thread management and worker task execution and focus on
- * policy issues. The simplest policy, StaticPolicy, does nothing other than
- * create a fixed number of threads.
- */
- class ThreadManager {
- protected:
- ThreadManager() {}
- public:
- virtual ~ThreadManager() {}
- /**
- * Starts the thread manager. Verifies all attributes have been properly
- * initialized, then allocates necessary resources to begin operation
- */
- virtual void start() = 0;
- /**
- * Stops the thread manager. Aborts all remaining unprocessed task, shuts
- * down all created worker threads, and realeases all allocated resources.
- * This method blocks for all worker threads to complete, thus it can
- * potentially block forever if a worker thread is running a task that
- * won't terminate.
- */
- virtual void stop() = 0;
- /**
- * Joins the thread manager. This is the same as stop, except that it will
- * block until all the workers have finished their work. At that point
- * the ThreadManager will transition into the STOPPED state.
- */
- virtual void join() = 0;
- enum STATE {
- UNINITIALIZED,
- STARTING,
- STARTED,
- JOINING,
- STOPPING,
- STOPPED
- };
- virtual const STATE state() const = 0;
- virtual boost::shared_ptr<ThreadFactory> threadFactory() const = 0;
- virtual void threadFactory(boost::shared_ptr<ThreadFactory> value) = 0;
- virtual void addWorker(size_t value=1) = 0;
- virtual void removeWorker(size_t value=1) = 0;
- /**
- * Gets the current number of idle worker threads
- */
- virtual size_t idleWorkerCount() const = 0;
- /**
- * Gets the current number of total worker threads
- */
- virtual size_t workerCount() const = 0;
- /**
- * Gets the current number of pending tasks
- */
- virtual size_t pendingTaskCount() const = 0;
- /**
- * Gets the current number of pending and executing tasks
- */
- virtual size_t totalTaskCount() const = 0;
- /**
- * Gets the maximum pending task count. 0 indicates no maximum
- */
- virtual size_t pendingTaskCountMax() const = 0;
- /**
- * Adds a task to be executed at some time in the future by a worker thread.
- *
- * This method will block if pendingTaskCountMax() in not zero and pendingTaskCount()
- * is greater than or equalt to pendingTaskCountMax(). If this method is called in the
- * context of a ThreadManager worker thread it will throw a
- * TooManyPendingTasksException
- *
- * @param task The task to queue for execution
- *
- * @param timeout Time to wait in milliseconds to add a task when a pending-task-count
- * is specified. Specific cases:
- * timeout = 0 : Wait forever to queue task.
- * timeout = -1 : Return immediately if pending task count exceeds specified max
- *
- * @throws TooManyPendingTasksException Pending task count exceeds max pending task count
- */
- virtual void add(boost::shared_ptr<Runnable>task, int64_t timeout=0LL) = 0;
- /**
- * Removes a pending task
- */
- virtual void remove(boost::shared_ptr<Runnable> task) = 0;
- static boost::shared_ptr<ThreadManager> newThreadManager();
- /**
- * Creates a simple thread manager the uses count number of worker threads and has
- * a pendingTaskCountMax maximum pending tasks. The default, 0, specified no limit
- * on pending tasks
- */
- static boost::shared_ptr<ThreadManager> newSimpleThreadManager(size_t count=4, size_t pendingTaskCountMax=0);
- class Task;
- class Worker;
- class Impl;
- };
- }}} // facebook::thrift::concurrency
- #endif // #ifndef _THRIFT_CONCURRENCY_THREADMANAGER_H_
|