在開發過程,我們經常遇到,處理一個大任務需要for回圈上百萬千萬次,任務簡單還好,一下子跑完,任務稍微複雜一點,跑一天幾天才能 纔能有結果,這時候程式就沒啥用處了。
舉個簡單例子,包工頭拉來一車的磚,一個人一隻一隻的搬,需要一天,若我叫上一百個人,時間就減少一百倍了,叫上兩百號人,時間就減少兩百倍了。轉到程式碼實現,我把請一個人比作建立一個執行緒,請十個人就建立十個執行緒,比如磚上面還有編號(0-9999),一共有10000塊磚,請了10個人,那麼每人就是1000塊,那我建立執行緒的時候就可以傳遞參數下去,告訴第一個人,你搬0-999號,告訴第二人,你負責搬1000到1999號,以此類推,十個人任務就分配完。
簡單的程式碼實現如下:
void *Multi_Threads(void * args)
{
int i=0;
int index= *(int*)args;
for(i=index;i<index+(10000/10);i++) // 10000/10 可以用參數傳遞,這裏爲了簡單就寫死
{
//do some thing
}
return NULL;
}
int main()
{
pthread_t pid[10];
int index[10]; //搬磚的起始編號,必須用陣列,不能用一個整型,不然建立執行緒的時候會導致傳值錯誤
int frequency= 10000/10; //每人一千
for(int i=0;i<10;i++)
{
index[i]= frequency*i;//0,1000,2000,3000....9000
if(pthread_create(&pid[i],NULL,Multi_Threads,(void*)&index[i])<0)
{
perror("pthread create http_send_data failure!");
return;
}
}
for(int i=0;i<10;i++)
pthread_join(pid[i],NULL);//等待執行緒結束
return 0;
}
若包工頭叫上一千的人,一萬的人呢,是否就可以無限制把時間縮短呢??錯,因爲你忽略了包工頭只有一個,他安排一萬個人花的的時間可能比你一萬個人搬磚的時間還久。這就是多執行緒的注意點,並不是你建立的越多越好,而是根據你多次嘗試後得到一個較好值,因爲你建立多執行緒的CPU只有一個,他排程這些多執行緒也需要花時間。