C++ 语言 设计多线程任务调度器

C++阿木 发布于 2025-06-14 3 次阅读


C++ 多线程任务调度器设计

随着计算机技术的发展,多线程编程已经成为提高程序性能的重要手段。在多任务环境中,合理地调度线程可以显著提升程序的响应速度和资源利用率。本文将围绕C++语言,设计一个简单的多线程任务调度器,以实现任务的合理分配和执行。

任务调度器概述

任务调度器是一种负责管理任务分配和执行的系统。在多线程环境中,任务调度器负责将任务分配给不同的线程,并确保线程之间的同步与互斥。本文设计的任务调度器将具备以下功能:

1. 任务创建与销毁
2. 任务队列管理
3. 线程池管理
4. 任务调度与执行
5. 线程同步与互斥

系统设计

1. 任务结构体

我们需要定义一个任务结构体,用于存储任务的相关信息,如任务ID、任务函数、任务参数等。

cpp
struct Task {
int id;
std::function func;
std::vector params;
};

2. 任务队列

任务队列用于存储待执行的任务。我们可以使用C++标准库中的`std::queue`来实现。

cpp
std::queue taskQueue;

3. 线程池

线程池用于管理执行任务的线程。我们可以使用C++标准库中的`std::thread`来实现。

cpp
std::vector threadPool;

4. 任务调度与执行

任务调度器需要从任务队列中取出任务,并分配给线程池中的线程执行。以下是任务调度与执行的伪代码:

cpp
void schedule() {
while (!taskQueue.empty()) {
Task task = taskQueue.front();
taskQueue.pop();
threadPool.push_back(std::thread(task.func, std::move(task.params)));
}
}

5. 线程同步与互斥

为了保证线程之间的同步与互斥,我们需要使用C++标准库中的`std::mutex`和`std::condition_variable`。

cpp
std::mutex mtx;
std::condition_variable cv;
bool isRunning = true;

以下是线程同步与互斥的伪代码:

cpp
void worker() {
while (isRunning) {
std::unique_lock lock(mtx);
cv.wait(lock, [] { return !taskQueue.empty() || !isRunning; });
if (!isRunning && taskQueue.empty()) {
break;
}
Task task = taskQueue.front();
taskQueue.pop();
lock.unlock();
task.func(std::move(task.params));
}
}

实现与测试

以下是任务调度器的完整实现:

cpp
include
include
include
include
include
include
include
include

struct Task {
int id;
std::function func;
std::vector params;
};

std::queue taskQueue;
std::vector threadPool;
std::mutex mtx;
std::condition_variable cv;
bool isRunning = true;

void schedule() {
while (!taskQueue.empty()) {
Task task = taskQueue.front();
taskQueue.pop();
threadPool.push_back(std::thread(task.func, std::move(task.params)));
}
}

void worker() {
while (isRunning) {
std::unique_lock lock(mtx);
cv.wait(lock, [] { return !taskQueue.empty() || !isRunning; });
if (!isRunning && taskQueue.empty()) {
break;
}
Task task = taskQueue.front();
taskQueue.pop();
lock.unlock();
task.func(std::move(task.params));
}
}

int main() {
// 创建线程池
for (int i = 0; i < 4; ++i) {
threadPool.push_back(std::thread(worker));
}

// 创建任务
Task task1{1, []() { std::cout << "Task 1 executed" << std::endl; }};
Task task2{2, []() { std::cout << "Task 2 executed" << std::endl; }};
Task task3{3, []() { std::cout << "Task 3 executed" << std::endl; }};

// 将任务加入队列
taskQueue.push(task1);
taskQueue.push(task2);
taskQueue.push(task3);

// 等待线程池执行完毕
for (auto& t : threadPool) {
t.join();
}

return 0;
}

总结

本文介绍了C++多线程任务调度器的设计与实现。通过任务队列、线程池、线程同步与互斥等机制,实现了任务的合理分配和执行。在实际应用中,可以根据需求对任务调度器进行扩展和优化,以满足更复杂的场景。