参考他人的方法,自己做了简单修改,实现一个通用的线程队列。
#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
退出函数