天天看點

我對多線程的了解

在通信軟體應用與設計課設中,用到了線程,對于線程的定義,我做了以下深入了解:線程,有時被稱為輕量級程序,是程式執行流的最小單元。一個标準的線程由線程ID,目前指令指針(PC),寄存器集合和堆棧組成。另外,線程是程序中的一個實體,是被系統獨立排程和分派的基本機關,線程自己不擁有系統資源,隻擁有一點兒在運作中必不可少的資源,但它可與同屬一個程序的其它線程共享程序所擁有的全部資源。一個線程可以建立和撤消另一個線程,同一程序中的多個線程之間可以并發執行。由于線程之間的互相制約,緻使線程在運作中呈現出間斷性。線程也有就緒、阻塞和運作三種基本狀态。就緒狀态是指線程具備運作的所有條件,邏輯上可以運作,在等待處理機;運作狀态是指線程占有處理機正在運作;阻塞狀态是指線程在等待一個事件(如某個信号量),邏輯上不可執行。每一個程式都至少有一個線程,若程式隻有一個線程,那就是程式本身。

線程是程式中一個單一的順序控制流程。程序内一個相對獨立的、可排程的執行單元,是系統獨立排程和分派CPU的基本機關指運作中的程式的排程機關。在單個程式中同時運作多個線程完成不同的工作,稱為多線程。

以下是我在做南工聊天伺服器時,用到的線程代碼:

void myAcceptThread()

{

 DWORD threadId;

 printMsg("開始myAcceptThread線程。。。\n");

 while(1)

 {

     printMsg("等待用戶端連接配接。。。\n");

  int cs = tcpAccept();

  //當有一個連接配接以上以後建立一個線程專門接收該連接配接的資料

  int ind = findIdelCinfo();

  if(ind == -1){

  //伺服器溢出

        continue;

  }

  cinfo[ind].isFree = 1;

  cinfo[ind].sock = cs;

  CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)myRecvThread,&cinfo[ind],0,&threadId);

 }

 printMsg("退出Accept線程。。。\n");

 return;

}

//根據傳入的套接字接收資料

void myRecvThread(ClientInfo *pcinfo)

{

 char buf[1024] = {0};

 sprintf(buf,"開始myRecvThread線程:%d......\n",pcinfo->threadId);

 printMsg(buf);

 while(1)

 {

  memset(buf,0,sizeof(buf));

  int len = tcpRecv(pcinfo->sock,buf,sizeof(buf));

  if(len == 0)

  {

   break;

  }

  unsigned char id = (unsigned char)buf[0];

  switch(id)

  {

  case LOGIN_MSG:

   procLoginMsg(pcinfo,(struct LoginMsg *)buf);

   break;

  case QUERY_FQQ:

   procFriendQqMsg(pcinfo,(struct FriendQqMsg *)buf);

   break;

  case TALK_MSG:

   procTalkMsg((struct TalkMsg *)buf);

   break;

  }

 }

 pcinfo->isFree = 0;

 sprintf(buf,"結束myRecvThread線程:%d......\n",pcinfo->threadId);

 printMsg(buf);

}

繼續閱讀