测试下异步任务,代码如下:

#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函数并没有切换线程。任务延迟执行了,但是没有切换线程。

更多推荐