参考他人的方法,自己做了简单修改,实现一个通用的线程队列。


 

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

#define POOL_SIZE 10
#define QUEUE_LEN 20
pthread_mutex_t queue_lock; //队列锁
pthread_cond_t queue_cond; //条件变量

int head = 0, tail = 0;
int queue[QUEUE_LEN];

void delay(int x)
{
int i,j;
for(i = 0; i < x; i++)
for(j = 0; j <x; j++);
}

void fun1(){
printf("fun1 start\n");
delay(1000);
printf("fun1 end\n");
}

void fun2(){
printf("fun2 start\n");
delay(2000);
printf("fun2 end\n");
}

void fun3(){
printf("fun3 start\n");
delay(3000);
printf("fun3 end\n");
}

void fun4(){
printf("fun4 start\n");
delay(4000);
printf("fun4 end\n");
}

int dequeue()//出对列函数
{
int y;
pthread_mutex_lock(&queue_lock);
while(head == tail)//队列中 无情求时,等待
{
pthread_cond_wait(&queue_cond, &queue_lock);//自动释放锁
}
y = queue[++head];//需做循环处理 queue[head] is NULL
if(head >= QUEUE_LEN)
head = 0;
pthread_mutex_unlock(&queue_lock);
return y;
}

void * process_queue(void *arg)
{
int x = 0;
for(;;)
{
x = dequeue();
printf("%d dequeue \n",x);
switch(x)
{
case 1:
fun1(); break;
case 2:
fun2(); break;
case 3:
fun3(); break;
default:
fun4(); break;
}
}
}

int enqueue(int x)//插入请求
{
int next;
pthread_mutex_lock(&queue_lock);
next = tail + 1;
if(next >= QUEUE_LEN)
next = 0;
if(next == head)
{
pthread_cond_signal(&queue_cond);//
pthread_mutex_unlock(&queue_lock);
return 0;// 表示队列已满
}
queue[next] = x;
tail = next;
pthread_cond_signal(&queue_cond);//激活
pthread_mutex_unlock(&queue_lock);
return 1;//入队成功
}

int main()
{
int i;
int num = 0;
pthread_t tid[POOL_SIZE];

pthread_mutex_init(&queue_lock, NULL);
pthread_cond_init(&queue_cond, NULL);

for(i = 0; i < POOL_SIZE; i++)
pthread_create(&tid[i], NULL, process_queue, NULL);

while(1)
{
scanf("%d",&num);
if(0 == num)
// break;
return 0;
printf("%d ",num);
while(!enqueue(num))//队列满时 等待
{
printf("queue is full\n");
sleep(1);
}
}

// for(i = 0; i < POOL_SIZE; i++)
// pthread_join(tid[i], NULL);

// pthread_mutex_destory(&queue_lock);
// pthread_cond_destroy(&queue_cond);

return 0;
}


 

 

还有一些不足之处,随后补上。


测试方法:

键入 :

4 3 2 1

结果:

4 3 2 1 4 dequeue

fun4 start

3 dequeue

fun3 start

2 dequeue

fun2 start

1 dequeue

fun1 start

fun1 end

fun2 end

fun3 end

fun4 end


键入:

0

退出函数