今天,我正在尝试为个人项目制作任务管理器。
我写了以下方法:
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 */
}
有人有想法可以帮助我吗?
先感谢您