今日は、個人プロジェクト用のタスク マネージャーを作ろうとしています。
私は次の方法を書きました:
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
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 */
}
誰でも私を助ける考えがありますか?
前もって感謝します