问题描述
我正在尝试用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);
}
请注意,您还必须解决同步问题