将引用作为任务数据传递 - 运行任务时的值相同

时间:2014-03-10 22:21:44

标签: c++ c++11 task pass-by-reference ppl

今天,我正在尝试为个人项目创建一个任务管理器。

我写了以下方法:

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

有人有意帮助我吗?

提前谢谢

1 个答案:

答案 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 一起使用,效果很好。

谢谢: - )