Thread Pool in C for web server
Busy waiting on an empty queue is doubleplusungood. Add a condition variable to the queue, let the threads to pthread_cond_wait on it, and pthread_cond_signal it when adding the task to the queue.
The functions you don't want to export (those with the leading underscores) shall be static.
sizeof(type) may lead to a double maintenance problem. Prefer sizeof(var), as in

thread_pool *pool = malloc(sizeof(*pool));