【问题标题】:C++ - Thread PoolC++ - 线程池
【发布时间】:2020-04-24 06:05:33
【问题描述】:

对于大学练习,我必须使用类构建一个线程池。我开始研究它,但遇到了一些问题。 我的想法是使用 ASYNC 生成线程,但编译器告诉我,我必须提供给 async 的函数应该是静态函数。问题是,如果线程的主函数是静态的,那么每个变量都必须是静态的,并且线程不能引用包括的所有变量 mutex。 经过一些尝试,我提出了这个解决方案,但我不知道这样进行是否好

class JobScheduler01 {
private:
    unsigned int numOfThread;
    std::vector<std::future<int>> pool;
    //std::vector<std::thread> pool_thread;

    std::list<Job> runningQueue;
    std::list<Job> waitingQueue;

    int ThreadMain(); // <- infinite loop

    std::mutex m;
public:

    JobScheduler01();
    ~JobScheduler01();
    void Start(); // <- start all the threads
};
void JobScheduler01::Start() {
    for(unsigned int i = 0; i < numOfThread; i++){
        pool.push_back(std::async([this](){return ThreadMain();})); // <------ QUESTION
    }
}

int JobScheduler01::ThreadMain() {
    // main loop here
    m.lock();
    std::cout << "thread: " << std::this_thread::get_id() << "\n";
    m.unlock();
    return 0;
}

我创建了一个 lambda 函数来启动主循环,但我不确定它是否正确。 这种方法会产生某种怪物吗?或者可以吗? 哪个可能是更好的解决方案? 使用 async 还是使用 std::thread 并将它们加入析构函数更好?

【问题讨论】:

  • 你的任务是创建一个线程池,但是std::async使用一个线程池。我怀疑讲师是否会因为仅使用其他人的线程池的解决方案而为您提供信誉。你应该让你的导师更详细地解释他们想要什么,但我的 猜测 是你应该创建std::thread 永远循环的实例(或者,直到被告知停止)选择 任务 来自阻塞队列的对象,并执行它们。 “任务”是一个带有一些虚成员函数的对象,工作线程通过调用虚函数来“执行”任务。
  • 首先我要感谢您的回复。我不知道异步使用线程池。我按照您的建议尝试了 std::thread ,但遇到了与异步相同的问题。我还询问了我的导师,他作为建议告诉我尝试使用 std::packaged_task。我在同一主题上发布了另一个问题,如果您想检查它,我将不胜感激。无论如何,非常感谢您的帮助。祝你有美好的一天

标签: c++ multithreading asynchronous lambda threadpool


【解决方案1】:

我建议尝试理解纯 c 中的线程池实现,例如 herehere,然后开始使用 c++ 替换(或在您的情况下实现)部分 c 代码(这可以是库代码,如 std::thread、std::vector、std::mutex、智能指针或 C++ 语言功能,如引用、模板和 lambda)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 2011-04-28
    • 2010-10-01
    • 1970-01-01
    相关资源
    最近更新 更多