c语言中的线程池
来源:互联网 发布:vb精简版 编辑:程序博客网 时间:2024/06/06 02:52
c语言中没有线程池,但是项目要用到,于是就从网上找了个代码,根据我的情况改了改,大体可以用了。
大概的过程是这样的。
1)初始化线程池,指定最大线程数;
2)将工作线程添加到线程池的等待队列中;
3)创建线程;
4)依次执行线程,等待队列中没有线程的话,线程就会彻底退出了;
5)等待所有线程结束;
6)销毁线程,退出。
PS: 下面的代码有轻微的内存泄露,有没有人可以找出来,我请他吃饭啊。
代码如下:
#include "log_compute.h"
#include <string>
#include <vector>
#include <map>
#include <fstream>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/types.h>
#include <pthread.h>
#include <assert.h>
using namespace std;
extern sys_conf_t sys_conf;
extern log casmi_log;
typedef struct worker
{
} CThread_worker;
typedef struct
{
} CThread_pool;
int pool_add_worker (void *(*process) (void *arg), void *arg);
void *thread_routine (void *arg);
int pool_destroy ();
void pool_init_list (int max_thread_num);
void pool_init_thread();
void pool_wait();
static CThread_pool *pool = NULL;
void
pool_init_list (int max_thread_num)
{
casmi_log.debug("%s(%d)",__FUNCTION__,__LINE__);
}
void
pool_init_thread ()
{
casmi_log.debug("%s(%d)",__FUNCTION__,__LINE__);
pool->threadid =
(pthread_t *) malloc (pool->max_thread_num * sizeof (pthread_t));
int i = 0;
for (i = 0; i < pool->max_thread_num; i++)
{
pthread_create (&(pool->threadid[i]), NULL, thread_routine,
NULL);
casmi_log.debug("%s(%d) created thread 0x%x",__FUNCTION__,__LINE__,pool->threadid[i]);
}
}
int
pool_add_worker (void *(*process) (void *arg), void *arg)
{
casmi_log.debug("%s(%d)",__FUNCTION__,__LINE__);
}
int
pool_destroy ()
{
casmi_log.debug("%s(%d)",__FUNCTION__,__LINE__);
casmi_log.debug("%s(%d)all thread out",__FUNCTION__,__LINE__);
}
void *
thread_routine (void *arg)
{
bool is_start = false;
casmi_log.debug("%s(%d)",__FUNCTION__,__LINE__);
if (pool->cur_queue_size <= 0)
{
casmi_log.debug("%s(%d) break 0x%x",__FUNCTION__,__LINE__,pthread_self());
break;
}
if (pool->queue_head == NULL)
{
casmi_log.debug("%s(%d) break 0x%x",__FUNCTION__,__LINE__,pthread_self());
break;
//pthread_exit(NULL);
}
}
void pool_wait()
{
casmi_log.debug("%s(%d)",__FUNCTION__,__LINE__);
while(pool->cur_queue_size)
{
casmi_log.debug("%s(%d) queue size = %d",__FUNCTION__,__LINE__,pool->cur_queue_size);
sleep(1);
}
for (int i = 0; i < pool->max_thread_num;i++)
{
casmi_log.debug("%s(%d) waiting for 0x%x",__FUNCTION__,__LINE__,pool->threadid[i]);
pthread_join (pool->threadid[i], NULL);
}
casmi_log.debug("%s(%d)all thread out",__FUNCTION__,__LINE__);
}
- c语言中的线程池
- c语言实现线程池
- C 语言创建线程池
- C 语言创建线程池
- c语言实现线程池
- 单线程中的通用定时器(C语言)
- Linux线程池C语言实现
- linux线程池的C语言实现
- linux线程池的C语言实现
- linux线程池的C语言实现
- linux线程池的C语言实现
- C语言实现简单线程池
- C语言实现简单线程池
- linux线程池的C语言实现
- Linux下的C语言线程池
- C语言实现简单线程池
- 嵌入式 C语言实现简单线程池
- C语言实现简单线程池
- .net架构的最后思考(箴言)
- 八皇后问题的非递归算法实现
- Android EditText属性总结
- 横屏和竖屏切换不用销毁重新建立android:configChanges
- 2008-SQL server: T-sql总结
- c语言中的线程池
- ASCII Table
- fstream、ifstream、ofsream使用的一点总结
- sql 1
- Linux下查看apache连接数
- omnet++出现找不到libinet.dll模块
- Apache连接数设置
- 安装iis后出现windows文件保护怎么办?
- 关于iframe ajax 跨越的简单列子