簡單練習了一下**,簡單實現了一下執行緒池類,增加對執行緒的理解和掌控。以後有時間再好好完善下,現在和大家分享下:
#include #include #include #include #include #include #include #include #include #include #include #include #include #includeusing namespace std;
typedef struct worker
worker_thread;
typedef vector::iterator task_itertor;
class threadpool
bool init(int number);
bool add(void *(*process) (void *arg), void *arg);
bool clear();
bool gettask(int index);
void *thread_run();
///方法成員
public:
///資料成員
private:
pthread_mutex_t m_lock; //執行緒鎖
pthread_cond_t m_ready; //條件變數
vectorm_threadpool; //執行緒容器
int isdestory; //是否銷毀
int m_max_thread_num; //活動的最大現場數
int cur_thread_index; //當前現場的索引
pthread_t* threadid;
task_itertor m_iter;
};static void *run(void *arg)
threadpool::threadpool(void)
threadpool::~threadpool()
bool threadpool::init(int number)
return true;
}bool threadpool::gettask(int index)
}bool threadpool::add(void *(* process)(void * arg),void * arg)
bool threadpool::clear()
isdestory = 1;
pthread_cond_broadcast(&m_ready);
for (int i = 0; i < m_max_thread_num; i++)
pthread_join (threadid[i], null);
delete threadid;
pthread_mutex_destroy(&m_lock);
pthread_cond_destroy(&m_ready);
m_threadpool.clear();
}void * threadpool::thread_run()
if (isdestory)
printf ("thread %0x is starting to work\n", pthread_self ());
cur_thread_index--;
worker_thread* work =&(*m_iter);
if (work != null)
/* for (;iter != m_threadpool.end();++iter)
} */
pthread_mutex_unlock(&m_lock);
} }
void * task_run (void *arg)
char *getcurrenttime(char *azp_currenttime)
int datetimecmp(char *azp_datetime1, /*時間1*/
char *azp_datetime2, /*時間2*/
long *alp_duration /*結果整形指標*/
)if (( lt_datetime2 = mktime( &ls_datetime2 )) == (time_t)-1 )
/*將比較結果寫入目標緩衝*/
*alp_duration = (long)difftime( lt_datetime1,lt_datetime2 );
return( 0 );
}int main()
; char lasttime[20]=;
long li_dur = 0;
threadpool::instance().init(3);
int i;
int *workingnum = (int *) malloc (sizeof (int) * 10);
getcurrenttime(curtime);
//printf("curtime=%s\n",curtime);
while(1)
strcpy(curtime,lasttime);
} }/*等待所有任務完成*/
sleep (10);
/*銷毀執行緒池*/
//threadpool::instance().clear();
free (workingnum);
return 0;
}
簡單執行緒池實現
執行緒池可以處理多執行緒問題,只要將任務放到任務佇列中,執行緒池中的執行緒就會從佇列中取任務,以預設的優先順序開始執行,如果你的任務數大於正在工作的執行緒數,則執行緒池將會建立一根新的執行緒來輔助工作,但是永遠都不會超過執行緒池中線程的最大值。執行緒池的結構 pragma once include ...
簡單執行緒池實現
1.用於執行大量相對短暫的任務 2.當任務增加的時候能夠動態的增加執行緒池中線程的數量值到達乙個閾值 3.當任務執行完畢的時候,能夠動態的銷毀執行緒池中的執行緒 4.該執行緒池的實現本質上也是生產者與消費者模型的應用。生產者執行緒向任務佇列新增任務,一旦佇列有任務到來,如果有等待 執行緒就喚醒來執行...
簡單執行緒池實現
1.用於執行大量相對短暫的任務 2.當任務增加的時候能夠動態的增加執行緒池中線程的數量值到達乙個閾值 3.當任務執行完畢的時候,能夠動態的銷毀執行緒池中的執行緒 4.該執行緒池的實現本質上也是生產者與消費者模型的應用。生產者執行緒向任務佇列新增任務,一旦佇列有任務到來,如果有等待執行緒就喚醒來執行任...