簡單的執行緒池

2021-08-04 22:10:21 字數 2017 閱讀 3581

開始看執行緒池感覺十分懵逼,什麼任務,任務對列,不知道是什麼東西。但是在網上找了一篇注釋詳細一點的**,仔細看看一遍,就慢慢清楚他大概是個什麼,大概是怎麼實現的。一邊看一遍加注釋,會幫助你理解。下面是我當時參考的一篇部落格,有乙個執行緒池**,比較簡單清晰。

#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...