日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多工作线程获取工作队列简单实现

發布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多工作线程获取工作队列简单实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以下是APUE線程章節中,簡單實現多工作線程獲取工作隊列源碼!


#include <stdio.h> #include <stdlib.h> #include <string.h> #include <pthread.h>/**************************** Define the job structure**************************/ struct job {struct job *j_next;struct job *j_prev;pthread_t j_pid; };/**************************** Define the queue* structure.**************************/ struct queue {struct job *q_head;struct job *q_tail;pthread_rwlock_t q_rwlock; };// Initialize a queue int queue_init( struct queue *qp) {int err; qp->q_head = NULL;qp->q_tail = NULL;if((err = pthread_rwlock_init(&qp->q_rwlock, NULL)) != 0){perror("pthread_rwlock_init"); return err; }return (0); }// Insert a job at the head of the queue. void job_insert(struct queue *qp, struct job *jp) {pthread_rwlock_wrlock(&qp->q_rwlock);jp->j_next = qp->q_head;jp->j_prev = NULL;if(qp->q_head == NULL) {qp->q_tail = jp;} else {qp->q_head->j_prev = jp;}qp->q_head = jp;pthread_rwlock_unlock(&qp->q_rwlock);return ; }// Append a job on the queue void job_append(struct queue *qp, struct job *jp) {pthread_rwlock_wrlock(&qp->q_rwlock);jp->j_prev = qp->q_tail;jp->j_next = NULL;if(qp->q_tail == NULL) {qp->q_head = jp;} else {qp->q_tail->j_next = jp;}qp->q_tail = jp;pthread_rwlock_unlock(&qp->q_rwlock); }// Remove the given job from a queue // remind: just remove the job from queue // don't free the space of the job void job_remove(struct queue *qp, struct job *jp) {pthread_rwlock_wrlock(&qp->q_rwlock);if(jp == qp->q_head) {qp->q_head = jp->j_next; if(qp->q_tail == jp){qp->q_tail = NULL; }} else if(jp == qp->q_tail) {qp->q_tail = jp->j_prev;if(qp->q_head == jp){qp->q_head == NULL;}} else {jp->j_prev->j_next = jp->j_next; jp->j_next->j_prev = jp->j_prev; }pthread_rwlock_unlock(&qp->q_rwlock); }// given a known pid, find out the job struct job * job_find (struct queue *qp, pthread_t pid) {struct job *jp = NULL;pthread_rwlock_rdlock(&qp->q_rwlock);for(jp = qp->q_head; jp != NULL; jp = jp->j_next){if(pthread_equal(pid, jp->j_pid))break;}pthread_rwlock_unlock(&qp->q_rwlock);return (jp); }

總結

以上是生活随笔為你收集整理的多工作线程获取工作队列简单实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。