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

本文提供了一个基于APUE的多线程工作队列实现案例,通过定义任务结构和队列结构,并实现了初始化队列、插入任务、追加任务、移除任务等关键功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下是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);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值