Skip to content
Snippets Groups Projects
threadpool.h 1.73 KiB
Newer Older
  • Learn to ignore specific revisions
  • spruett3's avatar
    spruett3 committed
    /**
     * threadpool.h
     *
     * A work-stealing, fork-join thread pool.
     */
    
    /* 
     * Opaque forward declarations. The actual definitions of these 
     * types will be local to your threadpool.c implementation.
     */
    struct thread_pool;
    struct future;
    
    /* Create a new thread pool with no more than n threads. */
    struct thread_pool * thread_pool_new(int nthreads);
    
    /* 
     * Shutdown this thread pool in an orderly fashion.  
     * Tasks that have been submitted but not executed may or
     * may not be executed.
     *
     * Deallocate the thread pool object before returning. 
     */
    void thread_pool_shutdown_and_destroy(struct thread_pool *);
    
    /* A function pointer representing a 'fork/join' task.
     * Tasks are represented as a function pointer to a
     * function.
     * 'pool' - the thread pool instance in which this task
     *          executes
     * 'data' - a pointer to the data provided in thread_pool_submit
     *
     * Returns the result of its computation.
     */
    typedef void * (* fork_join_task_t) (struct thread_pool *pool, void * data);
    
    /* 
     * Submit a fork join task to the thread pool and return a
     * future.  The returned future can be used in future_get()
     * to obtain the result.
     * 'pool' - the pool to which to submit
     * 'task' - the task to be submitted.
     * 'data' - data to be passed to the task's function
     *
     * Returns a future representing this computation.
     */
    struct future * thread_pool_submit(
            struct thread_pool *pool, 
            fork_join_task_t task, 
            void * data);
    
    /* Make sure that the thread pool has completed the execution
     * of the fork join task this future represents.
     *
     * Returns the value returned by this task.
     */
    void * future_get(struct future *);
    
    /* Deallocate this future.  Must be called after future_get() */
    void future_free(struct future *);