c++ 异步任务
·
测试下异步任务,代码如下:
#include <future>
int test1(std::string str, int i) {
std::cout << "调用test1函数, 线程ID: " << std::this_thread::get_id() << std::endl;
std::cout << "test1 run, param: " << str << ", i: " << i << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1)); // 当前线程休眠一秒. 阻塞当前线程。
std::cout << "test1 end" << std::endl;
return 666;
}
void testYiburenwu(void) { // 测试异步任务
std::cout << "testYiburenwu start, 线程ID: " << std::this_thread::get_id() << std::endl;
// 启动异步任务. std::launch::async表示立即在新线程中异步执行任务。
std::future<int> myFuture = std::async(std::launch::async, test1,
std::string("大家都听到了,是他叫我打,我才打的。像你这种要求,我这辈子没听过。"), 18);
// 执行其他工作
std::cout << "do other work..." << std::endl;
// get函数等待并获取结果. (若仅等待操作完成,不获取结果,调用wait函数)
std::cout << "result: " << myFuture.get() << std::endl; // 当异步任务尚未完成时调用get函数会阻塞当前线程,等待任务完成。
std::cout << "testYiburenwu end, 线程ID: " << std::this_thread::get_id() << std::endl;
}
调用testYiburenwu函数,打印:

ok. 从线程id看出确实是在子线程执行的任务。
再测试下另一种启动策略std::launch::deferred,代码如下:
#include <future>
int test1(std::string str, int i) {
std::cout << "调用test1函数, 线程ID: " << std::this_thread::get_id() << std::endl;
std::cout << "test1 run, param: " << str << ", i: " << i << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1)); // 当前线程休眠一秒. 阻塞当前线程。
std::cout << "test1 end" << std::endl;
return 666;
}
void testYiburenwu2(void) { // 测试std::launch::deferred启动策略
std::cout << "testYiburenwu2 start, 线程ID: " << std::this_thread::get_id() << std::endl;
// std::launch::deferred 表示任务延迟执行,直到调用 future.get() 或 future.wait() 时才运行
std::future<int> myFuture = std::async(std::launch::deferred, test1,
std::string("眉目传情"), 9527);
std::this_thread::sleep_for(std::chrono::seconds(1)); // 当前线程睡一秒
// 执行其他工作
std::cout << "do other work..." << std::endl;
// 等待并获取结果
std::cout << "result: " << myFuture.get() << std::endl; // 当异步任务尚未完成时调用get函数会阻塞当前线程,等待任务完成。
std::cout << "testYiburenwu2 end, 线程ID: " << std::this_thread::get_id() << std::endl;
}
调用testYiburenwu2函数,打印:

ok. 但发现执行test1函数并没有切换线程。任务延迟执行了,但是没有切换线程。
更多推荐

所有评论(0)