温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何在Linux C++中实现多线程的公平调度

发布时间:2024-11-18 10:01:15 来源:亿速云 阅读:80 作者:小樊 栏目:编程语言

在 Linux 中,C++11 标准提供了对多线程编程的支持

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
#include <vector>
#include <chrono>
#include <functional>

class FairScheduler {
public:
    void add_task(std::function<void()> task) {
        std::unique_lock<std::mutex> lock(queue_mutex_);
        tasks_.push(task);
        lock.unlock();
        condition_.notify_one();
    }

    void run() {
        while (true) {
            std::function<void()> task;
            {
                std::unique_lock<std::mutex> lock(queue_mutex_);
                condition_.wait(lock, [this] { return !tasks_.empty(); });
                task = std::move(tasks_.front());
                tasks_.pop();
            }
            task();
        }
    }

private:
    std::queue<std::function<void()>> tasks_;
    std::mutex queue_mutex_;
    std::condition_variable condition_;
};

int main() {
    FairScheduler scheduler;

    // 创建线程
    std::vector<std::thread> threads;
    for (int i = 0; i < 5; ++i) {
        threads.emplace_back([&scheduler] { scheduler.run(); });
    }

    // 添加任务
    for (int i = 0; i < 10; ++i) {
        int task_id = i;
        scheduler.add_task([task_id] {
            std::cout << "Task " << task_id << " is running on thread " << std::this_thread::get_id() << std::endl;
            std::this_thread::sleep_for(std::chrono::milliseconds(100));
        });
    }

    // 等待线程结束
    for (auto& thread : threads) {
        thread.join();
    }

    return 0;
}

在这个示例中,我们创建了一个名为 FairScheduler 的类,它使用一个队列来存储待执行的任务。add_task 方法用于向队列中添加任务,而 run 方法用于执行队列中的任务。run 方法使用条件变量来等待新任务的到来,从而实现公平调度。

main 函数中,我们创建了一个 FairScheduler 实例,并启动了 5 个线程来执行任务。然后,我们向队列中添加了 10 个任务,每个任务都会输出其 ID 和运行它的线程 ID。最后,我们等待所有线程结束。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++
AI