本文的**實現了乙個簡單的執行緒池,並利用c/s模型將客戶端所傳送的資料進行簡單的計算。
我是這麼理解的,池是電腦科學中一種典型的機制,如stl裡面的記憶體池,資料庫連線池,還有程序池或執行緒池。這些池建立的目的都是為了避免頻繁系統呼叫所帶來的開銷。我們這樣想,如果我們事先轉備好一大塊所需要的記憶體,或者執行緒,以後我們要用到時就直接拿來用就好了。不夠的話再執行其他解決方案。
在本文**中,定義了乙個執行緒池執行緒陣列,執行緒池水深(執行緒數)假定為5,這個值我們根據實際情況選擇。我們可以事先申請5個執行緒,讓他們在各自的執行緒執行函式內部迴圈,這就相當於block,但不是block。當我們需要線城時,直接拿來主義,讓該執行緒的work_state為busy態,這是全域性結構體變數,當檢測到此情況出現,執行緒run,這就是執行緒池的分配過程。
執行緒池**,將busy態改為idle態即可,繼續迴圈。
如果執行緒池不夠用,我對額外執行緒採用的機制是,來乙個申請乙個,走乙個銷毀乙個。
#pragma once
#include #include #include #include #include #include #include #include #include #include #include #include #define init_thread_num 5
#define maxline 1024
#define err_quit(m) \
dowhile(0)
typedef enumwork_state;
typedef enumoper_enum;
typedef struct oper_struct;
#include "../utili.h"
void math_operation(oper_struct *ptr, int *res);
static void* extra_thread_handler(void *arg);
static void* pool_thread_handler(void *arg);
bool find_idle_thread(int connfd);
typedef struct thread_extra thread_extra; //額外執行緒結構體
typedef struct thread_pool thread_pool; //執行緒池結構體
typedef thread_pool pool_array[init_thread_num]; //執行緒池執行緒陣列
pool_array pool;
int extra_num; //額外數目,用來計算額外線程式號
int main()
}
#include "../utili.h"
void input_opernum(oper_struct *pointer);
int main()
else if(strncmp(symbol, "sub", 3) == 0)
else if(strncmp(symbol, "mul", 3) == 0)
else if(strncmp(symbol, "div", 3) == 0)
else if(strncmp(symbol, "mod", 3) == 0)
else
send(sockfd, &ops, sizeof(ops), 0);
recv(sockfd, recvbuff, sizeof(int), 0);
printf("the answer is:>%d\n", *(int*)recvbuff);
} close(sockfd);
return 0;
}
*所有程式均經過驗證。
C 簡單執行緒池實現
執行緒池,簡單來說就是有一堆已經建立好的執行緒 最大數目一定 初始時他們都處於空閒狀態,當有新的任務進來,從執行緒池中取出乙個空閒的執行緒處理任務,然後當任務處理完成之後,該執行緒被重新放回到執行緒池中,供其他的任務使用,當執行緒池中的執行緒都在處理任務時,就沒有空閒執行緒供使用,此時,若有新的任務...
c 簡單執行緒池實現
boost threadpool參考 執行緒池,簡單來說就是有一堆已經建立好的執行緒 最大數目一定 初始時他們都處於空閒狀態,當有新的任務進來,從執行緒池中取出乙個空閒的執行緒處理任務,然後當任務處理完成之後,該執行緒被重新放回到執行緒池中,供其他的任務使用,當執行緒池中的執行緒都在處理任務時,就沒...
c 簡單執行緒池實現
執行緒池,簡單來說就是有一堆已經建立好的執行緒 最大數目一定 初始時他們都處於空閒狀態,當有新的任務進來,從執行緒池中取出乙個空閒的執行緒處理任務,然後當任務處理完成之後,該執行緒被重新放回到執行緒池中,供其他的任務使用,當執行緒池中的執行緒都在處理任務時,就沒有空閒執行緒供使用,此時,若有新的任務...