Files
progettoso/lib/threadpool/threadpool.h

82 lines
3.4 KiB
C
Raw Permalink Normal View History

#ifndef THREADPOOL_H_
#define THREADPOOL_H_
#include <pthread.h>
/**
* @file threadpool.h
* @brief Interfaccia per il ThreadPool
*/
/**
* @struct threafun_t
* @brief generico task che un thread del threadpool deve eseguire
*
* @var fun Puntatore alla funzione da eseguire
* @var arg Argomento della funzione
*/
typedef struct taskfun_t {
void (*fun)(void *);
void *arg;
} taskfun_t;
/**
* @struct threadpool
* @brief Rappresentazione dell'oggetto threadpool
*/
typedef struct threadpool_t {
pthread_mutex_t lock; // mutua esclusione nell'accesso all'oggetto
pthread_cond_t cond; // usata per notificare un worker thread
pthread_t * threads; // array di worker id
int numthreads; // numero di thread (size dell'array threads)
taskfun_t *pending_queue; // coda interna per task pendenti
int queue_size; // massima size della coda, puo' essere anche -1 ad indicare che non si vogliono gestire task pendenti
int taskonthefly; // numero di task attualmente in esecuzione
int head, tail; // riferimenti della coda
int count; // numero di task nella coda dei task pendenti
int exiting; // se > 0 e' iniziato il protocollo di uscita, se 1 il thread aspetta che non ci siano piu' lavori in coda
} threadpool_t;
/**
* @function createThreadPool
* @brief Crea un oggetto thread pool.
* @param numthreads è il numero di thread del pool
* @param pending_size è la size delle richieste che possono essere pendenti. Questo parametro è 0 se si vuole utilizzare un modello per il pool con 1 thread 1 richiesta, cioe' non ci sono richieste pendenti.
*
* @return un nuovo thread pool oppure NULL ed errno settato opportunamente
*/
threadpool_t *createThreadPool(int numthreads, int pending_size);
/**
* @function destroyThreadPool
* @brief stoppa tutti i thread e distrugge l'oggetto pool
* @param pool oggetto da liberare
* @param force se 1 forza l'uscita immediatamente di tutti i thread e libera subito le risorse, se 0 aspetta che i thread finiscano tutti e soli i lavori pendenti (non accetta altri lavori).
*
* @return 0 in caso di successo <0 in caso di fallimento ed errno viene settato opportunamente
*/
int destroyThreadPool(threadpool_t *pool, int force);
/**
* @function addTaskToThreadPool
* @brief aggiunge un task al pool, se ci sono thread liberi il task viene assegnato ad uno di questi, se non ci sono thread liberi e pending_size > 0 allora si cerca di inserire il task come task pendente. Se non c'e' posto nella coda interna allora la chiamata fallisce.
* @param pool oggetto thread pool
* @param fun funzione da eseguire per eseguire il task
* @param arg argomento della funzione
* @return 0 se successo, 1 se non ci sono thread disponibili e/o la coda è piena, -1 in caso di fallimento, errno viene settato opportunamente.
*/
int addToThreadPool(threadpool_t *pool, void (*fun)(void *),void *arg);
/**
* @function spawnThread
* @brief lancia un thread che esegue la funzione fun passata come parametro, il thread viene lanciato in modalità detached e non fa parte del pool.
* @param fun funzione da eseguire per eseguire il task
* @param arg argomento della funzione
* @return 0 se successo, -1 in caso di fallimento, errno viene settato opportunamente.
*/
int spawnThread(void (*f)(void*), void* arg);
#endif /* THREADPOOL_H_ */