线程安全队列的实现 Linux version

#include <pthread.h>
#include <stdio.h>

static pthread_mutex_t mutexLock;
static pthread_cond_t condNotFull;
static pthread_cond_t condNotEmpty;

static int queueSize   = 0;
static int curQueSize  = 0;

static int curFrontIdx = 0;
static int curRearIdx  = 0;

static int *pQueue     = NULL;

int initialize()
{
    int a;

    scanf("input the queue size: %d\n", a);
    if (a < 1)
    {
        printf("queue size must be bigger than 0\n");
        return -1;
    }
    queueSize = a;

    pQueue = (int *)malloc(sizeof(int) * queueSize);
    if (NULL == pQueue)
    {
        printf("no more memory is availabe\n");
        return -1;
    }

    pthread_mutex_init(mutexLock, NULL);
    pthread_cond_init(condNotFull, NULL);
    pthread_cond_init(condNotEmpty, NULL);

    return 0;
}


void enqueue(int element)
{
    pthread_mutex_lock(&mutexLock);

    while (curQueSize >= queueSize)
    {
        pthread_cond_wait(&condNotFull, &mutexLock);
    }

    pQueue[curRearIdx] = element;
    curRearIdx = (curRearIdx + 1) % queueSize;
    ++curQueSize;

    pthread_mutex_unlock(&mutexLock);


    //populate the signal anyway
    pthread_cond_signal(&condNotEmpty);
} 


int dequeue()
{
    int retVal;

    pthread_mutex_lock(&mutexLock);

    while (0 == curQueSize)
    {
        pthread_cond_wait(&condNotEmpty, &mutexLock);
    } 

    retVal = pQueue[curFrontIdx];
    curFrontIdx = (curFrontIdx + 1) % queueSize;
    --curSize;

    pthread_mutex_unlock(&mutexLock);


    // populate the signal anyway
    pthread_cond_signal(&condNotFull);

    reutrn retVal;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值