1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
/* * ThreadQueue.h * * Created on: 2008-11-13 * Author: root */ #ifndef THREADQUEUE_H_ #define THREADQUEUE_H_ #include <pthread.h> #include <iostream> using std::cout; using std::endl; const int QUEUESIZE = 20; template<class Object> class ThreadQueue { public: ThreadQueue(); ~ThreadQueue(); public: bool Enter(Object *obj); Object* Out(); bool IsEmpty(); bool IsFull(); private: int front; int rear; int size; Object *list[QUEUESIZE]; pthread_mutex_t queueMutex; }; //------------------------------------------------------ template<class Object> ThreadQueue<Object>::ThreadQueue() { front = rear = 0; size = QUEUESIZE; pthread_mutex_lock(&queueMutex); } //------------------------------------------------------ template<class Object> bool ThreadQueue<Object>::Enter(Object* obj) { pthread_mutex_lock(&queueMutex); if(IsFull()) { cout << "Queue is full!" << endl; pthread_mutex_unlock(&queueMutex); return false; } list[rear] = obj; rear = (rear + 1) % size; pthread_mutex_unlock(&queueMutex); return true; } //------------------------------------------------------ template<class Object> Object* ThreadQueue<Object>::Out() { Object* temp; pthread_mutex_lock(&queueMutex); if(IsEmpty()) { cout << "Queue is empty!" << endl; pthread_mutex_unlock(&queueMutex); return false; } temp = list[front]; front = (front + 1) % size; pthread_mutex_unlock(&queueMutex); return temp; } //------------------------------------------------------ template<class Object> bool ThreadQueue<Object>::IsEmpty() { if(rear == front) return true; else return false; } //------------------------------------------------------ template<class Object> bool ThreadQueue<Object>::IsFull() { if((rear + 1) % size == front) return true; else return false; } //------------------------------------------------------ template<class Object> ThreadQueue<Object>::~ThreadQueue() { delete []list; } //------------------------------------------------------ #endif /* THREADQUEUE_H_ */ 以下为main.cpp /* * main.cpp * * Created on: 2008-11-13 * Author: root */ #include "ThreadQueue.h" #include <iostream> using namespace std; struct Data { int fd ; //char buf[1024]; }; int main() { ThreadQueue<Data> *t = new ThreadQueue<Data>(); int k = 10; for(int i = 1; i <= 10; i++) { Data* d = new Data(); d->fd = i; // strcpy(d->buf,"AAAA"); bool a = t->Enter(d); if(a) cout << "true" << endl; else cout << "false" << endl; } Data *temp; //int *temp; for(int i = 1; i <= 10; i++) { //temp = t->Out(); //cout << *temp << endl; temp = t->Out(); cout << temp->fd << endl; //cout << temp->buf << endl; delete temp; } return 0; } |
发表评论
要发表评论,您必须先登录。