開始看執行緒池感覺十分懵逼,什麼任務,任務對列,不知道是什麼東西。但是在網上找了一篇注釋詳細一點的**,仔細看看一遍,就慢慢清楚他大概是個什麼,大概是怎麼實現的。一邊看一遍加注釋,會幫助你理解。下面是我當時參考的一篇部落格,有乙個執行緒池**,比較簡單清晰。
:
#include
#include
#include//鎖
#include
#define n 3
void * run_pthread();
typedef
struct worker //任務通用結構體(所謂通用是因為每個任務可能不同)
pthread_worker;
typedef
struct
pthread_pool;
pthread_pool *mpool=null; //宣告乙個池子
int init_pool(void) //初始化池子;
}void * run_pthread(void) //執行緒工作函式
//2。如果沒任務(任務已經完了),要結束了要摧毀池子,就讓執行緒退出
if(mpool->destroy==1)
//3.以上條件都不滿足,說明有任務可以執行就開始執行任務,執行任務首先需要把池子資料改一下;
pthread_worker *timp_work=mpool->head;
mpool->head=timp_work->next;
mpool->sum_queue_work--;
//4.池子修改完了就可以解鎖,然後執行剛剛那出來的任務了;
pthread_mutex_unlock(&mpool->queue_lock);
(*(timp_work->work))(timp_work->argv); //執行讀取的任務函式,注意這個指標形式
free(timp_work); //釋放掉之前的那個任務鍊錶結點,timp指標指向空;這兩步感覺特別體現細節,我自己只想到要釋放,沒想到制空,更加嚴謹吧;
timp_work=null;
}pthread_exit (null); //這一句應該是不可達的
}void*add_work(void*(*job)(void *argv),void* arg) //新增任務,即給任務鍊錶加結點(注意引數,傳入函式指標,給函式的引數)
mpool->sum_queue_work++;
printf("新增乙個任務\n");
//3.對池子操作完啦,開鎖,並通知子執行緒們活來了
pthread_mutex_unlock(&mpool->queue_lock);
pthread_cond_signal(&mpool->queue_cond); //這裡是如果有乙個執行緒是在等待,則那個執行緒會被開啟;如果執行緒都是在忙碌,那這個訊號就沒有意義;
return0;}
void *destroy_pthread(void) //銷毀池子
pthread_mutex_destroy(&(mpool->queue_lock)); //銷毀鎖,條件變數
pthread_cond_destroy(&(mpool->queue_cond));
free(mpool); //銷毀池子;
mpool=null;
return0;}
以上就是乙個池子
下面我們實驗一下
void * thisiswork()
int main()
sleep(40);
destroy_pthread();
return
0;}
簡單的執行緒池
執行緒池就是執行緒的一種使用模式。雖然執行緒是輕量級的程序,但是執行緒的建立和銷毀還是會引發效率問題。並且,如果建立的執行緒過多,反而會增加很多的排程開銷,影響系統效率。執行緒池就是可以提前建立好一些執行緒,在我們需要使用執行緒的時候,對已經建立好的執行緒新增任務就好。這裡我寫的這個執行緒池的原理如...
執行緒池的簡單認識
executor框架 執行緒池的幾種狀態 執行緒池原理 執行緒池儲存任務的queue 最大執行緒數 newfixedthreadpool linkedblockingqueue 使用者指定 newcachedthreadpool synchronousqueue integer.max value ...
執行緒池的簡單實用
c 執行緒池threadpool的用法 最近,因為做專案的關係,用到了很多和執行緒有關的東西。由於以前對執行緒只是有乙個概括的了解,並沒有深入的研究過,所以在面對一些問題時,總會感覺到有心無力,為此也花費了大量的時間和精力。為了鞏固這方面的知識,特寫此文章和大家分享。1 最簡單的執行緒例子 clas...