哈尔滨门户网站建设网络营销的特点包含()。
web/
2025/9/27 5:45:59/
文章来源:
哈尔滨门户网站建设,网络营销的特点包含()。,手机网站安全证书过期怎么处理,如何用域名做网站访问文章首发于我的个人博客#xff1a;欢迎大佬们来逛逛 文章目录 处理带返回值的函数asyncpackaged_taskpromise 处理带返回值的函数
有三种方法#xff1a;
asyncpackaged_taskpromise
async
第一种方法是使用 async 函数。
步骤#xff1a;
使用 async 创建线程处理函… 文章首发于我的个人博客欢迎大佬们来逛逛 文章目录 处理带返回值的函数asyncpackaged_taskpromise 处理带返回值的函数
有三种方法
asyncpackaged_taskpromise
async
第一种方法是使用 async 函数。
步骤
使用 async 创建线程处理函数使用 .get() 获取返回值。
async函数具有两个属性
launch::async默认表示创建线程处理函数并且立刻执行launch::defered延期当使用wait或者get的时候才会执行线程处理函数
async函数的返回值std::future 类型通过调用其 get 方法获取返回值
下面分别演示了普通函数与类的成员函数以及 defered 的作用
int value1(int num) {return num;
}//类对象
class Foo {
public:Foo() {}int getValue(int num) {std::chrono::milliseconds duration(2000);std::this_thread::sleep_for(duration);return num * 2;}
};void testAsync() {//直接执行默认是launch::asyncstd::futureint res1 std::async(value1, 100);std::cout res1.get() \n;Foo m{};//类成员函数std::futureint res2 std::async(Foo::getValue, m, 200);std::cout res2.get() \n;//不会立刻执行auto res3 std::async(std::launch::deferred, Foo::getValue, m, 400);//调用get执行线程std::cout res3.get() \n;
}packaged_task
第二种方法是使用 packaged_task 方法
步骤
使用 packaged_task 来包装线程处理函数然后将这个包装好的函数加入到线程 thread 中并且执行线程处理函数最后使用这个 packaged_task 调用 get_future 来获取 future然后调用 get 获取值。
package_task 函数包装语法
//包装普通函数
std::packaged_task返回类型(形参列表) pack1(函数名称);//包装类的成员函数
std::packaged_task返回类型(形参列表) pack2(bind(函数地址成员变量地址placeholders占位符))//包装lambda表达式
std::packaged_taskint(int) pack3([](形参列表){xxxxreturn xxx;
});可以看到对于类的成员函数是相对比较复杂的。
void testPackaged_task() {//1. 普通函数的包装std::packaged_taskint(int) pack1(value1);std::thread t1(std::ref(pack1),100); //转换为t1.join();std::cout pack1.get_future().get() \n;//2. 类中成员函数的包装Foo m{};std::packaged_taskint(int) pack2(std::bind(Foo::getValue, m, std::placeholders::_1));std::thread t2(std::ref(pack2), 200);t2.join();std::cout pack2.get_future().get() \n;//3. lambda表达式std::packaged_taskint(int) pack3([](int num) {std::cout id: std::this_thread::get_id() \n;return num * 2;});std::thread t3(std::ref(pack3),300);t3.join();std::cout pack3.get_future().get() \n;
}promise
第三种方法是使用 promise 类型
步骤
传递 promise 类型的变量到线程处理函数中。我们正常执行线程处理函数即可无需使用return语句在操作完成后把需要的值 set_value 设置为promise 的值。然后使用 thread 创建并且执行线程处理函数。然后我们就可以在外部使用 .get_future 获取 future对象 继而 .get 获取值。
这种方法的特点
无需显示设置 return 语句需要往线程处理函数添加一个额外的 promise 类型的参数。
例如这个是我们的线程处理函数我们需要返回 num *3 但是现在我们添加一个promise 类型的参数注意是引用然后直接 set_value 即可然后再外部就可以直接访问这个值了。
void testThread(std::promiseint pms, int num) {std::cout get_id() \n;pms.set_value(num * 3);
}返回线程处理函数的值
std::promiseint pms;
std::thread t1(testThread, std::ref(pms), 100);
t1.join();
auto num pms.get_future().get();
std::cout num \n;这种方法也可以传递线程的值到另一个线程处理函数中
有一个 testGetValueThread 线程函数我们需要把刚才获取的 num*3 的值再传递进去则可以在这个线程函数内调用 .get_future().get() 来传递参数。
下面是两种方法这里使用了函数重载作为线程处理函数需要使用static_cast来避免重载歧义。 通过static_cast消除重载函数的歧义 void testGetValueThread(std::promiseint pms) {std::cout 获取值: pms.get_future().get() \n;
}
void testGetValueThread(int num) {std::cout 获取值: num \n;
}...std::promiseint pms2;pms2.set_value(99);//值传递到其他线程中//通过static_cast消除重载函数的歧义std::thread t2(static_castvoid(*)(std::promiseint)(testGetValueThread), std::ref(pms2));t2.join();std::thread t3(static_castvoid(*)(int)(testGetValueThread), num);t3.join();
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/81011.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!