今天,我正在尝试为个人项目创建一个任务管理器。
我写了以下方法:
template<class Callback, class... Args>
void ThreadManager::AddTaskToRun(Callback&& fun, Args&&... args)
{
task_handle<function<void()>> task = make_task([&]()
{
fun(forward<Args>(args)...);
});
/* Another code */
}
我用以下样本称呼它:
void Test(int taskId)
{
wcout << "Hello " << taskId << endl;
}
threadManager.AddTaskToRun(Test, 1);
threadManager.AddTaskToRun(Test, 2);
threadManager.AddTaskToRun(Test, 3);
和
int x = 0;
threadManager.AddTaskToRun(Test, x);
x++;
threadManager.AddTaskToRun(Test, x);
x++;
threadManager.AddTaskToRun(Test, x);
问题是,在调试模式下(使用Visual Studio 2013),我得到以下结果:
Hello 1 (first test)
Hello 2
Hello 3
和
Hello 2 (second test, with a variable in argument)
Hello 2
Hello 2
第二次测试有一个大问题吗? : - )
如果我在发布模式下测试:
你好3 你好3 你好3
和
你好2 你好2 你好2
好。我觉得这很奇怪。我在网上搜索但一无所获。我刚看到如果我在“make_task”或“create_task”(PPL)之外运行我的函数,所有结果都很好:
template<class Callback, class... Args>
void ThreadManager::AddTaskToRun(Callback&& fun, Args&&... args)
{
fun(forward<Args>(args)...);
/* Another code */
}
有人有意帮助我吗?
提前谢谢
答案 0 :(得分:0)
经过几个小时的测试,我找到了解决方案。我在 thread.h 文件中搜索,并在其构造函数 _Decay_copy 中发现,并尝试在我的方法中使用它:
template<class Callback, class... Args>
void ThreadManager::AddTaskToRun(Callback&& fun, Args&&... args)
{
task_handle<function<void(void)>> task = bind(_Decay_copy(forward<Callback>(fun)), _Decay_copy(forward<Args>(args))...);
/* Another code */
}
将任务与 task_group 一起使用,效果很好。
谢谢: - )