0

今天,我正在尝试为个人项目制作任务管理器。

我写了以下方法:

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 */
}

有人有想法可以帮助我吗?

先感谢您

4

1 回答 1

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一起使用,它可以正常工作。

谢谢 :-)

于 2014-03-11T16:16:12.320 回答