在函数中使用传递的参数列表

问题描述

我正在尝试用C ++构建一个线程管理器系统,我向其提供命令,如果有可用线程,它将开始工作。我做了一个模板,是因为我不假定函数应该如何传递给系统,并且因为我希望它通常可以在函数上工作。

整个概念对我来说都是理论上的。我的想法是:

  • 获取功能
  • 如果有线程可用,它将运行它
  • 完成后,它将分离线程

所以我可以跟踪正在使用多少个线程。

template <typename _Ty> void ThreadManager::Run(_Ty T,...) //T should be a function
{
    using namespace std::literals::chrono_literals;
    while (!is_free_thread_available())std::this_thread::sleep_for(1ms);

    va_list args;
    va_start(args,T);

    auto F = void[=]() {
        std::this_thread::sleep_for(1ms); //to make sure the thread will be added to the vector
        T(args); //i assume this should not work
        for (int i = 0; i < Threads.size(); i++)     //Threads = std::vector<std::thread>
            auto& t = Threads[i];
            if (std::this_thread::get_id() == t.get_id())
            {
                Threads.erase(Threads.begin() + i); t.detach(),break; //not sure if detaching the active thread works
            }
    }

    std::thread Thread(F);
    Threads.push_back(Thread);

}

代码无法运行。它返回一个未解析的外部符号。我可能需要一些帮助使其运行

解决方法

在使用C ++时,请避免使用C省略号并使用可变参数模板:

这将解决您的编译问题:

template <typename Func,typename ... Args>
void ThreadManager::Run(Func func,Args... args)
{
    using namespace std::literals::chrono_literals;

    while (!is_free_thread_available()) std::this_thread::sleep_for(1ms);

    auto F = void[=]() {
        func(args...);

        // TODO: Synchronization needed to avoid race condition
        for (int i = 0; i < Threads.size(); i++)     //Threads = std::vector<std::thread>
            auto& t = Threads[i];
            if (std::this_thread::get_id() == t.get_id())
            {
                Threads.erase(Threads.begin() + i);
                break;
            }
    }
    // TODO: Synchronization needed to avoid race condition
    Threads.emplace_back(F);
}

请注意,您还必须解决同步问题