-
线程池需要考虑:
1. 添加工作任务
2. 查询工作任务是不是完成, wait/done/cannel_if
3. 结束/等/强杀 任务池
- 2指的是 对每一个工作任务的执行
- 如果再增强点就可以hook工作时间
服务器可以用来测试每一个任务的工作统计
用户线程池主要有几个目的,
添加任务,并可以等这个处理的处理结果,
定时的查询这个任务执行怎么样了,
手动清除了一个任务,
停止任务池时是否等所有加入队列的任务执行完
添加任务,并可以等这个处理的处理结果,
定时的查询这个任务执行怎么样了,
手动清除了一个任务,
停止任务池时是否等所有加入队列的任务执行完
#ifndef RPC_THREADPOOL_H
#define RPC_THREADPOOL_H
typedef struct rpc_tp rpc_tp_t;
typedef struct rpc_tp_worker rpc_tp_worker_t;
typedef void (* rpc_tp_complete_cb)(rpc_tp_worker_t * worker, void * opaque);
typedef void * (* rpc_tp_process_cb)(void * opaque);
typedef enum rpc_tp_state
{
tp_state_idle = 0,
tp_state_busy,
tp_state_complete,
tp_state_invalid,
} rpc_tp_state;
typedef enum rpc_tp_kill
{
tp_kill_immediate,
tp_kill_wait
} rpc_tp_kill;
#ifdef __cplusplus
extern "C" {
#endif
rpc_tp_t * rpc_tp_create(int nthreads);
rpc_tp_worker_t * rpc_tp_worker_add(rpc_tp_t * pool, rpc_tp_process_cb process_cb, void * opaque, rpc_tp_complete_cb complete_cb);
rpc_tp_state rpc_tp_worker_touch(rpc_tp_worker_t * worker);
void * rpc_tp_worker_wait(rpc_tp_worker_t * worker);
void rpc_tp_worker_free(rpc_tp_worker_t * worker);
void rpc_tp_destroy(rpc_tp_t * pool, rpc_tp_kill type);
#ifdef __cplusplus
}
#endif
#endif
#include "rpc_threadpool.h"
void * process_cb(void * opaque)
{
int taskid;
taskid = (int)opaque;
printf("taskid = %d.\n", taskid);
Sleep(2000);
return NULL;
}
void complete_cb(rpc_tp_worker_t * worker)
{
rpc_tp_worker_free(worker);
}
int main()
{
rpc_tp_t * pool;
pool = rpc_tp_create(5);
{
rpc_tp_process_cb pcb;
rpc_tp_complete_cb ccb;
void * opaque;
int tasks;
pcb = process_cb;
ccb = complete_cb;
for (tasks = 0; tasks < 19; tasks++)
{
rpc_tp_worker_t * worker;
rpc_tp_state state;
void * result;
opaque = (void *)tasks;
worker = rpc_tp_worker_add(pool, pcb, opaque, ccb);
state = rpc_tp_worker_touch(worker);
result = NULL;
//result = rpc_tp_worker_wait(worker);
}
rpc_tp_destroy(pool, tp_kill_wait);
printf("destory ok.\n");
}
}
喜欢技术交流,不喜欢索要免费啤酒的,实现细节可以讨论