多線程使用循環隊列其實也不是個很難的東西,在工做中遇到了一個隊列行爲很是古怪,怎麼也想不通,一直都沒有認證對待這些,有點怵,因此這回想認真對待一下。ios
多線程使用循環隊列主要就是要避免兩個線程同時操做隊列,加個鎖就能夠很容易的實現,win32中用臨界區就能夠作到。多線程
代碼:app
// CirQueue.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <Windows.h> #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; #define MAXSIZE 10 typedef struct Queue{ int data[MAXSIZE]; int front; int rear; int size ; CRITICAL_SECTION cs ; }Queue; void initQueue(Queue *q); void showQueue(Queue *q); int inQueue(Queue *q,int num); int outQueue(Queue *q); void deQueue(Queue *q) ; Queue *q ; DWORD WINAPI ThreadFuncFirst(LPVOID param) { int iCount = 0; while(iCount < 60){ if (!inQueue(q,iCount)) { Sleep(10) ; continue ; } printf("inQueue = %d \n",iCount) ; iCount ++ ; } return 0; } DWORD WINAPI ThreadFuncSecond(LPVOID param) { int iCount = 60; int tar ; while(iCount > 0){ iCount-- ; tar = outQueue(q) ; if (tar < 0) { Sleep(10) ; continue ; } printf("outQueue = %d \n",tar) ; } return 0; } int _tmain(int argc, _TCHAR* argv[]) { q = (Queue *)malloc(sizeof(Queue)); initQueue(q); printf("-----------start-------------- \n") ; DWORD dwThreadID = 0; HANDLE handleFirst = CreateThread(NULL, 0, ThreadFuncFirst, 0, 0, &dwThreadID); if (!handleFirst) { cout<<"create thread 1 error:"<<endl; } HANDLE handleSecond = CreateThread(NULL, 0, ThreadFuncSecond, 0, 0, &dwThreadID); if (!handleSecond) { cout<<"create thread 2 error:"<<endl; } WaitForSingleObject(handleFirst, INFINITE);//等待線程返回,用sleep()就太山寨了 WaitForSingleObject(handleSecond, INFINITE); CloseHandle(handleFirst);//句柄默認值2 這裏減1,線程函數執行完後釋放資源。 CloseHandle(handleSecond); deQueue(q) ; printf("-----------end-------------- \n") ; system("pause") ; return 0; } void initQueue(Queue *q){ int i; for(i=0;i<MAXSIZE;i++){ q->data[i]= -111 ; } q->front=0; q->rear =0; q->size = 0 ; InitializeCriticalSection(&q->cs) ; } void showQueue(Queue *q){ EnterCriticalSection(&q->cs) ; printf("front-"); int len = q->size ; for(int i=0;i<len;i++){ if(q->front+i<MAXSIZE) printf("%d-",q->data[q->front+i]); else printf("%d-",q->data[q->front+i-MAXSIZE]); } printf("rear\n"); LeaveCriticalSection(&q->cs) ; } int inQueue(Queue *q,int num){ int ret = 1 ; EnterCriticalSection(&q->cs) ; if(q->size >= MAXSIZE) { ret = 0; } else { q->data[q->rear] = num; q->size ++ ; q->rear = (q->rear+1)%MAXSIZE; } LeaveCriticalSection(&q->cs) ; return ret; } int outQueue(Queue *q){ int num = -1 ; EnterCriticalSection(&q->cs) ; if(q->size <= 0) { num = -1; } else { num = q->data[q->front]; q->size -- ; q->front = (q->front+1)%MAXSIZE; } LeaveCriticalSection(&q->cs) ; return num; } void deQueue(Queue *q) { free(q) ; }
代碼中,一個線程向隊列中寫數據,另外一個從隊列中讀數據,隊列的結構體有成員CRITICAL_SECTION cs ; 用來防止兩個隊列同時對隊列進行訪問。函數
完整工程代碼:http://download.csdn.net/download/qq_33892166/9725911spa