提问者:小点点

分离类方法并在C++中异步运行它


我有一个API调用,它通知调用者任务已经启动,并在内部异步执行该任务,因为该任务可能需要足够的时间。

我试着用两个类来描述我的场景

  • Manager类具有激发和遗忘方法run_long_task,该方法现在只包含一个睡眠调用。
  • MyAPI类公开了一个方法,该方法希望启动run_long_task,但必须立即返回给调用方,返回一个“task id”。 同时,Manager::RUN_LONG_TASK启动。

如何实现此功能? 如何使用线程或std::async分离run_long_task方法? 当前代码是同步的,因此modifyVarAndRunAsyncTask将阻塞。

我想用类似的方法

std::thread({run_async_task();})。detach();

如何使用类成员来完成?

代码在下面

 class Manager {
    public:
        void run_long_task(const uint32_t& ms) {
    
            try {
                //example job
                std::this_thread::sleep_for(std::chrono::milliseconds(ms));
            } catch( ... ) {
                cout << "report the error" << endl;
            }
    
        }
    
        Manager(int x, int y) : x_(x), y_(y) {}
    
        int getX() const {
            return x_;
        }
    
        int getY() const {
            return y_;
        }
    
    private:
        int x_;
        int y_;
    };
    
    class MyAPI {
    
    public:
        MyAPI(const shared_ptr<Manager> &manager, int var) : manager_(manager), var_(var) {}
    
        int getVar() const {
            return var_;
        }
    
        int modifyVarAndRunAsyncTask(int var, uint32_t ms) {
            var_ = var_ + var;
            manager_->run_log_task(50000);
            return var_;
        }
    
    private:
        std::shared_ptr<Manager> manager_ {nullptr};
        int var_ {0};
    };
    
    int main(int argc, char** argv) {
    
        std::shared_ptr<Manager> manager = std::make_shared<Manager>(1,2);
        auto api = std::make_shared<MyAPI>(manager, 5);
        runs for ever (1) {
            api->modifyVarAndRunAsyncTask(10, 10000);
        }
    
    } 

共1个答案

匿名用户

如何从ModifyVarAndRunAsyncTask调用Manager::Run_Long_Task?

//first argument has to be "this" for the member function
std::thread t1(&Manager::run_long_task, manager_.get(), 50000); 
t1.detach();

虽然std::thread的构造函数接受一个函数并传递它的参数,但我认为只使用lambda更容易:

std::thread t1(
    [this](){ manager_->run_long_task(50000); }
);
t1.detach();

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(分离|类|方法|并在|c++|中|异步|运行)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?