如何把for回圈拆分爲多執行緒

2020-08-10 14:40:51

   在開發過程,我們經常遇到,處理一個大任務需要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只有一個,他排程這些多執行緒也需要花時間。