多線程與迴圈隊列

來源:互聯網
上載者:User

標籤:wait   free   queue   結構   ica   多線程   span   start   成員   

    多線程使用迴圈隊列其實也不是個很難的東西,在工作中遇到了一個隊列行為非常古怪,怎麼也想不通,一直都沒有認證對待這些,有點怵,所以這回想認真對待一下。

    多線程使用迴圈隊列主要就是要避免兩個線程同時操作隊列,加個鎖就可以很容易的實現,win32中用臨界區就可以做到。

代碼:

// 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 10typedef 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/9725911

多線程與迴圈隊列

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.