#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;
}
线程安全队列的实现 Linux version
最新推荐文章于 2023-12-02 23:22:20 发布