我有一个API调用,它通知调用者任务已经启动,并在内部异步执行该任务,因为该任务可能需要足够的时间。
我试着用两个类来描述我的场景
如何实现此功能? 如何使用线程或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);
}
}
如何从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();