gpt4 book ai didi

c++ - 如何重新安排并发任务?

转载 作者:行者123 更新时间:2023-11-28 00:55:13 26 4
gpt4 key购买 nike

粗体的简短解释。

我有一个 tbb::task 可以这样总结:

class UpdateTask
: public tbb::task
{
public:
tbb::task* execute()
{
// some work...

if( can_continue() )
{
// make sure this is re-executed
this->recycle_to_reexecute(); //looks like it is deprecated but it's more clear to me
return nullptr; // ? or this? or tbb::empty_task?

}

return nullptr;

}

};

我希望此任务在完成后立即重新安排,直到满足条件为止。我以这种方式分配此任务:

UpdateTask& updater = *new(tbb::task::allocate_root()) UpdateTask();

虽然不确定它是否与问题有关。

问题:当我运行代码时,我从 tbb(最新修订版,4.1.5)获得断言(在调试中),但我找不到使其正常工作的方法。

我重新阅读了文档,但我找不到这方面的简单示例,而且我不清楚我做错了什么。我做了一些实验:

  • 在我刚刚展示的代码中,断言说我应该返回一个任务:
    断言 t_next 在文件 ...\itbb\src\tbb\custom_scheduler.h 的第 485 行失败
    详细描述:重新执行需要方法execute()返回另一个
    任务
  • 然后如果我返回这个,断言表明应该分配任务:
    断言 t_next->state()==task::allocated 在文件 ...\itbb\src\tbb\custom_scheduler.h 的第 452 行失败
    详细说明:如果task::execute()返回task,必须标记为allo
    满足
  • 有疑问,我试图返回一个 tbb::empty_task,我动态创建(检查),分配为 new(tbb::task::allocate_child()) tbb::empty_task()。我得到了这条消息的断言 Assertion p.ref_count==0 failed on line 107 of file ...\itbb\src\tbb\custom_scheduler.h
    详细描述:任务完成导致前任的引用计数为
    下溢

那么,怎么做呢?我认为它很简单,但无法找到它的完成方式。与任务引用计数有关吗?


更新:这是一个完整的代码,非常接近我所拥有的:

#include <iostream>
#include <atomic>

#include <tbb/tbb.h>

namespace test { class UpdateTask : public tbb::task { public:

UpdateTask() { std::cout << "[UpdateTask]" << std::endl; }

~UpdateTask() { std::cout << "\n[/UpdateTask]" << std::endl; }

tbb::task* execute() { std::cout << "Tick "<< m_count <<std::endl;

++m_count;

// make sure this is re-executed this->recycle_to_reexecute(); //return new(tbb::task::allocate_continuation()) tbb::empty_task(); return nullptr; }

private:

std::atomic<int> m_count;

};


tbb::task_list m_task_list;


void register_update_task() { UpdateTask& updater =
*new(tbb::task::allocate_root()) UpdateTask(); m_task_list.push_back( updater ); }

void run_and_wait() { tbb::task::spawn_root_and_wait( m_task_list ); }

void tbb_test() { register_update_task(); run_and_wait();

}

}

int main()
{

test::tbb_test();

std::cout << "\nEND";
std::cin.ignore();

return 0;
}

所以,在这里我得到了第一个异常,说我应该返回一个任务。在 execute() 函数中,如果我用评论的那个替换返回值,那么它似乎可以工作,但是有两个问题:

  • 我必须在每次执行调用完成时创建一个 empty_task 任务???
  • 在第一次调用 execute() 之后,主线程恢复。这不是 spawn_root_and_wait() 应该做的。毕竟任务还没有完成并且被正确地重新安排了。

我必须得出结论,这也不是正确的方法。

最佳答案

this->recycle_to_reexecute();

已弃用。

替换为:

this->increment_ref_count();
this->recycle_as_safe_continuation();

享受

P.S.:类(class)结束(在您的情况下)从执行中返回 NULL

关于c++ - 如何重新安排并发任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11847689/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com