直接贴代码了,实践中也经常用到,没必要每次都自己写。
struct queue{ void *prev; void *next; int count; enum queuestate state; pthread_mutex_t mutex; pthread_cond_t cond; }; //初始化 static inline void init_queue(struct queue *q) { q->prev = q->next = q; q->count = 0; pthread_mutex_init(&q->mutex, NULL); pthread_cond_init(&q->cond, NULL); } //入队 static inline void enqueue(struct link_list *item, struct queue *q_head) { if (item == NULL) { return; } pthread_mutex_lock(&q_head->mutex); struct link_list *q_tail = NULL; q_tail = q_head->prev; ((struct link_list *)item)->prev = q_tail; ((struct link_list *)item)->next = q_head; q_tail->next = item; q_head->prev = item; q_head->count++; pthread_cond_signal(&q_head->cond); pthread_mutex_unlock(&q_head->mutex); return; } //出队 static inline void *dequeue(struct queue *q_head) { struct link_list *q_item = NULL, *next = NULL; pthread_mutex_lock(&q_head->mutex); while (0 == q_head->count) { pthread_cond_wait(&q_head->cond, &q_head->mutex); } q_item = q_head->next; next = q_item->next; q_head->next = q_item->next; next->prev = q_item->prev; q_head->count--; q_item->prev = NULL; q_item->next = NULL; pthread_mutex_unlock(&q_head->mutex); return q_item; } struct my_msg { void *prev; void *next; char data[MAX_MSG_SIZE]; int len; }; int main() { struct queue mqtt_send; init_queue(&mqtt_send); struct my_msg *test = (struct my_msg *)malloc(sizeof(struct my_msg)); //入队 enqueue(&mqtt_send, test); //出队 struct my_msg *newtest = (struct my_msg *)dequeue(&mqtt_send); return 0; }