队列、函数-多线程 线程队列的实现-by小雨
生活随笔
收集整理的這篇文章主要介紹了
队列、函数-多线程 线程队列的实现-by小雨
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
發一下牢騷和主題無關:
????考參他人的方法,自己做了簡略修改,現實一個通用的線程隊列。
????
#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 NULLif(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
????退出函數
文章結束給大家分享下程序員的一些笑話語錄: 古鴿是一種搜索隱禽,在中國快絕跡了…初步的研究表明,古鴿的離去,很可能導致另一種長著熊爪,酷似古鴿,卻又習性不同的猛禽類——犤毒鳥
總結
以上是生活随笔為你收集整理的队列、函数-多线程 线程队列的实现-by小雨的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 区分内边距与外边距padding和mar
- 下一篇: Android:ListView