这里,我们首先要实现一种数据结构,将相应的任务,线程的fd,还有队列实现。
声明代码如下:
1 #ifndef _HEAD_H 2 #define _HEAD_H 3 #include <stdio.h> 4 #include <stdlib.h> 5 #include <unistd.h> 6 #include <string.h> 7 #include <sys/stat.h> 8 #include <sys/select.h> 9 #include <sys/types.h> 10 #include <fcntl.h> 11 #include <pthread.h> 12 #include <sys/time.h> 13 #include <signal.h> 14 #define MSG_LEN 1024 15 #define TASK_CNT 1024 16 extern pthread_mutex_t lock; 17 extern pthread_cond_t cond1; 18 extern pthread_cond_t cond2; 19 typedef struct tag_fd 20 { 21 int s_rfd; 22 int s_wfd; 23 struct tag_fd *next; 24 }FD,*pFD; 25 typedef struct tag_task 26 { 27 char s_msg[MSG_LEN]; 28 int s_fd; 29 }TASK,*pTASK; 30 typedef struct tag_que 31 { 32 TASK arr[TASK_CNT+1]; 33 int front; 34 int tail; 35 }QUEUE,*pQUEUE; 36 void fd_insert(pFD *phead,int rfd,int wfd); 37 void fd_init(pFD *phead); 38 int fd_find(pFD phead,int rfd); 39 void fd_del(pFD *phead,int rfd); 40 void add_task(pQUEUE pq,pTASK pt); 41 void get_task(pQUEUE pq,pTASK pt); 42 void excute_task(pTASK pt); 43 #endif
我们需要根据线程的占用情况,控制好,所以我们应把线程插入到一个链表中。
实现代码如下:
1 #include "head.h" 2 void fd_init(pFD *phead) 3 { 4 *phead= NULL; 5 } 6 void fd_insert(pFD *phead,int rfd,int wfd) 7 { 8 pFD pnew = (pFD )calloc(1,sizeof(FD)); 9 pnew->s_rfd=rfd; 10 pnew->s_wfd=wfd; 11 pnew->next = *phead; 12 *phead = pnew; 13 } 14 int fd_find(pFD phead,int rfd) 15 { 16 while(phead) 17 { 18 if(phead->s_rfd==rfd) 19 break; 20 else 21 phead = phead->next; 22 } 23 if(phead == NULL) 24 return -1; 25 else 26 return phead->s_wfd; 27 } 28 29 void fd_del(pFD *phead,int rfd) 30 { 31 pFD pcur,ppre; 32 pcur=*phead; 33 ppre=NULL; 34 while(pcur) 35 { 36 if(pcur->s_rfd == rfd) 37 break; 38 else 39 { 40 ppre=pcur; 41 pcur = pcur ->next; 42 } 43 } 44 if(ppre==NULL) 45 { 46 *phead=pcur->next; 47 free(pcur); 48 pcur=NULL; 49 } 50 else 51 { 52 ppre->next=pcur->next; 53 free(pcur); 54 pcur=NULL; 55 } 56 }
然后,我们还需要实现对任务的控制,例如任务的添加、获得、执行等。
实现代码如下:
1 #include "head.h" 2 static int que_empty(pQUEUE pq) 3 { 4 return pq->front == pq->tail; 5 } 6 static int que_full(pQUEUE pq) 7 { 8 return (pq->tail+1)%(TASK_CNT+1)==pq->front; 9 } 10 static int que_cnt(pQUEUE pq) 11 { 12 return (pq->tail - pq->front +TASK_CNT+1)%(TASK_CNT + 1); 13 } 14 void add_task(pQUEUE pq ,pTASK pt) 15 { 16 pthread_mutex_lock(&lock); 17 while(que_full(pq)) 18 pthread_cond_wait(&cond1,&lock); 19 pq->arr[pq->tail]=*pt; 20 pq->tail = (pq->tail+1)%(TASK_CNT+1); 21 if(que_cnt(pq)==1) 22 pthread_cond_broadcast(&cond2); 23 printf("添加了一个任务!! "); 24 pthread_mutex_unlock(&lock); 25 } 26 void get_task(pQUEUE pq ,pTASK pt) 27 { 28 pthread_mutex_lock(&lock); 29 while(que_empty(pq)) 30 pthread_cond_wait(&cond2,&lock); 31 *pt=pq->arr[pq->front]; 32 pq->front = (pq->front+1)%(TASK_CNT+1); 33 if(que_cnt(pq)== TASK_CNT -1) 34 pthread_cond_broadcast(&cond1); 35 printf("获得了一个任务!! "); 36 pthread_mutex_unlock(&lock); 37 } 38 39 40 void excute_task(pTASK pt) 41 { 42 char buf[1024]; 43 memset(buf,0,1024); 44 strcpy(buf,pt->s_msg); 45 int index; 46 for(index=0;index < strlen(buf);index++) 47 buf[index]=toupper(buf[index]); 48 buf[index]='