各位大佬请教一个问题,当我实现任务队列时rpushTasksQueue始终要比我上限少一个,比如我设定的上限是3,然后他2执行完就结束了,求救
#include <stdio.h>
#include "config.h"
#include "queue.h"
// 初始化任务队列
void initTasksQueue(struct TasksQueue* queue) {
for (int i = 0; i < MAX_THREADS; i++) {
printf("[*] 初始化任务队列[%d]\n",i);
queue->front[i][0] = queue->rear[i][0] = -1;
}
}
// 获取任务队列总数
int getTasksQueueCount(struct TasksQueue* queue, int thread_id) {
// 如果头指针和尾指针的值都等于-1,代表该队列为空
if (queue->front[thread_id][0] == -1 && queue->rear[thread_id][0] == -1) {
return 0;
}
// 计算任务中的总数:(尾指针-头指针+最大任务数)%最大任务数,如:(1-0+2)%2
printf("%d当前任务数%d\n",thread_id,(queue->rear[thread_id][0] - queue->front[thread_id][0] + MAX_TASKS_PER_THREAD) % MAX_TASKS_PER_THREAD);
return (queue->rear[thread_id][0] - queue->front[thread_id][0] + MAX_TASKS_PER_THREAD) % MAX_TASKS_PER_THREAD;
}
// 获取负载最低队列id
int getIdleTasksQueueKey(struct TasksQueue* queue) {
// 初始化最小值为,队列数据上限
int min = MAX_TASKS_PER_THREAD;
// 初始化线程id,-1代表没有空闲
int task_thread_index = -1;
// 循环便利最大线程数
for (int i = 0; i < MAX_THREADS; i++) {
// 接收每个线程的任务总数
int count = getTasksQueueCount(queue, i);
if (count == 0) {
// 线程空闲时直接返回
return i;
}
// 线程里任务总数低于上限,小于上一次最小值,则本线程优先级最高
if (count < MAX_TASKS_PER_THREAD && count < min) {
min = count;
task_thread_index = i;
}
}
// 返回线程id
return task_thread_index;
}
// 入队
int rpushTasksQueue(struct TasksQueue* queue, struct Task* task, int thread_id) {
// 检查当前队列是否为空,如果为空头指针和尾指针设置为0
if (queue->front[thread_id][0] == -1 && queue->rear[thread_id][0] == -1) {
queue->front[thread_id][0] = queue->rear[thread_id][0] = 0;
}
// 计算尾部指针移动后的位置:尾指针+1
int nextRear = (queue->rear[thread_id][0] + 1) % MAX_TASKS_PER_THREAD;
if (nextRear == queue->front[thread_id][0]) {
printf("[*] 线程[%d]已满\n",thread_id+1);
return 0;
}
// 数据写入
queue->tasks[thread_id][queue->rear[thread_id][0]] = *task;
// 移动指针
queue->rear[thread_id][0] = nextRear;
return 1;
}
// 出队
int lpopTasksQueue() {
return 0;
}
// 模拟添加数据
for (int j = 0; j<5; j++) {
printf("\n\n[*] 当前第[%d]轮检查\n",j+1);
// 获取负载最低队列id
int getIdleTasksQueueKeyResult = getIdleTasksQueueKey(&tasksQueue);
printf("[*] 当前空闲线程[%d]\n",getIdleTasksQueueKeyResult+1);
if (getIdleTasksQueueKeyResult == -1) {
printf("[*] 当前没有空闲线程,稍后再试\n");
continue;
}
struct Task task = {
.order_number="wwww", // 订单号
.account="18210560183", // 充值账号
.location="重庆", // 归属地
.city="重庆", // 所属城市
.face_value=100 // 面值
};
int rpushTasksQueueResult = rpushTasksQueue(&tasksQueue, &task, getIdleTasksQueueKeyResult);
if (rpushTasksQueueResult == 1) {
printf("[*] 订单[]加入线程[%d]\n",getIdleTasksQueueKeyResult+1);
}
}