資源簡介
自己寫的非常好用的C語言線程,純C代碼,可以隨便用。

代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?“threadPool.h“
#ifdef?__cplusplus
#if?__cplusplus
extern?“C“?{
#endif
#endif?/*?End?of?#ifdef?__cplusplus?*/
static?CThread_pool?*pool?=?NULL;
void?pool_init?(int?max_thread_num)
{
pool?=?(CThread_pool?*)malloc(sizeof(CThread_pool));
pthread_mutex_init(&(pool->queue_lock)?NULL);
pthread_cond_init(&(pool->queue_ready)?NULL);
pool->queue_head?=?NULL;
pool->max_thread_num?=?max_thread_num;
pool->cur_queue_size?=?0;
pool->shutdown?=?0;
pool->threadid?=?(pthread_t?*)malloc(max_thread_num?*?sizeof(pthread_t));
int?i?=?0;
for?(i=0;?i {?
pthread_create(&(pool->threadid[i])?NULL?thread_routine?NULL);
}
}
/*向線程池中加入任務*/
int?pool_add_worker?(void?*(*process)(void?*arg)?void?*arg)
{
????/*構(gòu)造一個新任務*/
????CThread_worker?*newworker?=?(CThread_worker*)malloc(sizeof(CThread_worker));
????newworker->process?=?process;
????newworker->arg??=?arg;
????newworker->next?=?NULL;??/*別忘置空*/
????pthread_mutex_lock?(&(pool->queue_lock));?
????/*將任務加入到等待隊列中*/
????CThread_worker?*member?=?pool->queue_head;
????if?(member?!=?NULL)
{
????????while?(member->next?!=?NULL)?member?=?member->next;
????????member->next?=?newworker;
}
????else
{
pool->queue_head?=?newworker;
}
assert(pool->queue_head?!=?NULL);
pool->cur_queue_size++;
pthread_mutex_unlock(&(pool->queue_lock));
/*好了,等待隊列中有任務了,喚醒一個等待線程*/
????pthread_cond_signal(&(pool->queue_ready));
????return?0;
}
/*銷毀線程池,等待隊列中的任務不會再被執(zhí)行,但是正在運行的線程會一直
??把任務運行完后再退出*/
int?pool_destroy?()
{
if?(pool->shutdown)
return?-1;/*防止兩次調(diào)用*/
pool->shutdown?=?1;
/*喚醒所有等待線程,線程池要銷毀了*/
pthread_cond_broadcast(&(pool->queue_ready));
????/*阻塞等待線程退出,否則就成僵尸了*/
????int?i;
for?(i=0;?imax_thread_num;?i++)
pthread_join(pool->threadid[i]?NULL);
free(pool->threadid)?pool->threadid?=?NULL;
????/*銷毀等待隊列*/
CThread_worker?*head?=?NULL;
while?(pool->queue_head?!=?NULL)
{
head?=?pool->queue_head;
pool->queue_head?=?pool->queue_head->next;
free(head);
}
/*條件變量和互斥量也別忘了銷毀*/
pthread_mutex_destroy(&(pool->queue_lock));
pthread_cond_destroy(&(pool->queue_ready));
free(pool)?pool=NULL;
return?0;
}
void*?thread_routine?(void?*arg)
{
for?(;;)
????{????
????????pthread_mutex_lock?(&(pool->queue_lock));
????????/*如果等待隊列為0并且不銷毀線程池,則處于阻塞狀態(tài);?注意
????????pthread_cond_wait是一個原子操作,等待前會解鎖,喚醒后會加鎖*/
????????while?(pool->cur_queue_size?==?0?&&?!pool->shutdown)
????????{
?????????????//printf(“thread?0x%x?is?waiting\n“?pthread_self?());
?????????????pthread_cond_wait(&(pool->queue_ready)?&(pool->queue_lock));
????????}
????/*線程池要銷毀了*/
????if?(pool->shutdown)
????????{
????????????/*遇到breakcontinuereturn等跳轉(zhuǎn)語句,千萬不要忘記先解鎖*/
?????????????pthread_mutex_unlock(&(pool->queue_lock));
?????????????printf(“thr
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2015-12-03?17:27??c語言線程池\
?????文件????????3987??2015-12-03?17:27??c語言線程池\threadPool.c
?????文件????????1124??2015-10-22?17:04??c語言線程池\threadPool.h
評論
共有 條評論