该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include
#include
#include
#define MAX_ITEM 3 /* 每次最多取三个任务 */
typedef struct job * Job;
/* 链表结点结构 */
struct job{
pthread_t tid; /* 线程ID */
Job next; /* 下一个链表结点 */
int val; /* 结点值 */
};
pthread_mutex_t q_lock = PTHREAD_MUTEX_INITIALIZER; /* 全局变量锁 */
int insert(Job *head, int val, pthread_t tid)
{
Job p, q;
p = *head; /* 头指针 */
if(p != NULL){ /* 判断空链表的情况 */
while(p->next != NULL){
p = p->next;
}
}
q = (struct job *)malloc(sizeof(struct job)); /* 为结点分配内存空间 */
if(q == NULL){
perror("fail to malloc");
return -1;
}8
q->next = NULL;
q->val = val;
q->tid = tid; /* 设置结点的所有者,线程1 */
p->next = q; /* 将结点链入任务队列 */
if(p == NULL){ /* 设置链表头指针 */
*head = q;
return 0;
}
p->next = q; /* 插入到队列中 */
return 0;
}
void get_job(Job head, Job task, int *count)
{
struct job *p, *q;
pthread_t tid;
q = head; /* 参数是任务队列头 */
p = q->next; /* 指针p作为q的后继,两个指针共同前进 */
tid = pthread_self();
while(p != NULL){ /* 便利链表,判断每个任务结点 */
if(tid == p->tid){ /* 找到属于当前线程的任务结点 */
q->next = p->next;
p->next = task; /* 将该结点从原始的任务队列中摘下 */
task = p; /* 链入到新的当前线程的任务队列上去 */
p = q->next;
*count++; /* 已取任务是递增 */