commit
aebc8255cb
5 changed files with 170 additions and 0 deletions
@ -0,0 +1,2 @@ |
|||
/cmake-build-debug/ |
|||
/cmake-build-release/ |
@ -0,0 +1,8 @@ |
|||
cmake_minimum_required(VERSION 3.0) |
|||
|
|||
set(CMAKE_C_STANDARD 99) |
|||
|
|||
project(tiny_thread_pool LANGUAGES C) |
|||
|
|||
add_executable(tiny_pool main.c tiny_pool.c) |
|||
target_link_libraries(tiny_pool pthread) |
@ -0,0 +1,23 @@ |
|||
#include <stdio.h> |
|||
#include <pthread.h> |
|||
#include "tiny_pool.h" |
|||
|
|||
void* demo_fun(void *i) { |
|||
printf("demo func -> %d\n", *(int*)i); |
|||
return NULL; |
|||
} |
|||
|
|||
int main() { |
|||
|
|||
pthread_t tid; |
|||
|
|||
int d = 123; |
|||
|
|||
pool_t *pool = tiny_pool_create(0); |
|||
|
|||
tiny_pool_submit(pool, demo_fun, (void*)&d); |
|||
|
|||
|
|||
|
|||
return 0; |
|||
} |
@ -0,0 +1,100 @@ |
|||
#include <malloc.h> |
|||
#include "tiny_pool.h" |
|||
|
|||
pool_t* tiny_pool_create(uint32_t size) { |
|||
|
|||
pool_t *pool = (pool_t*)malloc(sizeof(pool_t)); |
|||
|
|||
for (int i = 0; i < 8; ++i) { |
|||
pool->threads[i] = 0; |
|||
} |
|||
|
|||
pool->task_queue_front = NULL; |
|||
pool->task_queue_rear = NULL; |
|||
pool->task_queue_size = 0; |
|||
|
|||
return pool; |
|||
|
|||
} |
|||
|
|||
void tiny_pool_submit(pool_t *pool, void* (*func)(void*), void *arg) { |
|||
|
|||
task_t *new_task = (task_t*)malloc(sizeof(task_t)); |
|||
|
|||
new_task->func = func; |
|||
new_task->arg = arg; |
|||
new_task->next = NULL; |
|||
|
|||
// TODO: lock task queue
|
|||
|
|||
if (pool->task_queue_rear == NULL) { // queue without element
|
|||
|
|||
pool->task_queue_front = new_task; |
|||
pool->task_queue_rear = new_task; |
|||
|
|||
} else { // queue emplace back
|
|||
|
|||
pool->task_queue_rear->next = new_task; |
|||
pool->task_queue_rear = new_task; |
|||
|
|||
} |
|||
|
|||
++pool->task_queue_size; |
|||
|
|||
// TODO: unlock task queue
|
|||
|
|||
} |
|||
|
|||
task_t* task_queue_pop(pool_t *pool) { |
|||
|
|||
// TODO: lock task queue
|
|||
|
|||
if (pool->task_queue_front == NULL) { |
|||
|
|||
return NULL; // pop failed -> empty queue
|
|||
|
|||
} |
|||
|
|||
task_t *tmp = pool->task_queue_front; |
|||
|
|||
if (pool->task_queue_front == pool->task_queue_rear) { |
|||
|
|||
// queue is empty now
|
|||
pool->task_queue_front = NULL; |
|||
pool->task_queue_rear = NULL; |
|||
|
|||
} else { |
|||
|
|||
pool->task_queue_front = tmp->next; |
|||
|
|||
} |
|||
|
|||
// TODO: unlock task queue
|
|||
|
|||
return tmp; |
|||
|
|||
} |
|||
|
|||
|
|||
void* thread_working() { |
|||
|
|||
// TODO: main loop for one thread
|
|||
|
|||
// TODO: check if thread pool exiting
|
|||
|
|||
// TODO: pop one task --failed--> blocking wait
|
|||
// --success--> start running and then free task_t
|
|||
|
|||
return NULL; |
|||
|
|||
} |
|||
|
|||
|
|||
void tiny_pool_boot(pool_t *pool) { |
|||
|
|||
// TODO: create admin thread
|
|||
|
|||
// TODO: create N work-threads (using N = 8 in dev)
|
|||
|
|||
} |
|||
|
@ -0,0 +1,37 @@ |
|||
#ifndef TINY_POOL_H_ |
|||
#define TINY_POOL_H_ |
|||
|
|||
#include <stdint.h> |
|||
#include <pthread.h> |
|||
|
|||
typedef struct task_t { |
|||
void* (*func)(void*); |
|||
void *arg; |
|||
struct task_t *next; |
|||
} task_t; |
|||
|
|||
|
|||
typedef struct { |
|||
|
|||
pthread_t threads[8]; |
|||
|
|||
task_t *task_queue_front; |
|||
task_t *task_queue_rear; |
|||
uint32_t task_queue_size; |
|||
pthread_mutex_t task_queue_busy; |
|||
|
|||
} pool_t; |
|||
|
|||
|
|||
pool_t* tiny_pool_create(uint32_t size); |
|||
|
|||
void tiny_pool_submit(pool_t *pool, void* (*func)(void*), void *arg); |
|||
|
|||
// TODO: confirm just run once
|
|||
void tiny_pool_boot(pool_t *pool); |
|||
|
|||
// TODO: thread pool status -> preparing / running / exiting / exited
|
|||
|
|||
// TODO: destroy method
|
|||
|
|||
#endif |
Loading…
Reference in new issue