资讯 更多 >>
今日关注:期望值
有东西!有球迷拿着欧文的球衣去参...
各地加强灾害风险预报预警 推进防...
世界今日报丨安徽合肥一安置房疑现...
跑步那么无聊,那跑步的时候你都在...
用中国品牌零部件!阿斯顿·马丁加...
国家药监局:加快罕见病药物上市 ...
【独家焦点】比亚迪宣布在巴西打造...
吉林拉升避暑消费“凉动能”
2023全球数字经济大会:数实融合深...
动态更多 >>
武汉市烟花爆竹燃放规定2023_全球速递
大金重工董秘回复:公司截至2023年1...
左江科技01月10日获深股通增持5.12万股
【当前热闻】百勤油服(02178)授出75...
目标规模50亿元!郑州市产业母基金...
郑州至比利时列日货航成功首航 每日焦点
京东金条延迟还款会上征信吗
世界关注:有意思小周刊(2023.01.0...
IPv6板块1月9日跌0.39%,东方通领跌...
中邮钱包网贷逾期51年会影响征信吗
会展 更多 >>
美籍酿酒师在崇礼:中国是第二故乡...
河南项城报告2名疑似新冠肺炎病例 ...
浙江绍兴确诊病例首次零新增 上虞...
广西东兴实行全员居家隔离 启动口...
新疆全方位推进乡村振兴 “富春山...
云南瑞丽市主城区全员核酸检测结果...
内蒙古满洲里累计治愈出院本土确诊...
孙海洋夫妻驱车山东阳谷:还在为孙...
大国工匠追梦“玉米强国”40载:用...
让南海“海洋热带雨林”斑斓多彩
专题报道 
当前位置: 资讯 > >> 正文
 
今日关注:期望值
来源:哔哩哔哩     时间:2023-07-05 23:10:34

异步

异步(Asynchronous)指的是在程序执行过程中,某个操作可以独立于主线程进行。异步操作可以在后台执行,不阻塞主线程,从而提高系统的并发性和响应性。异步编程通过使用回调函数、事件驱动或者协程等机制,允许程序在等待某个操作完成的同时,继续执行其他任务。异步操作通常会在后台线程中执行,主线程不需要等待操作完成,而是通过回调函数或其他方式获取操作结果。

C++中,可以使用std::async启动一个异步任务,它会返回一个std::future对象(期望值),这个对象持有任务的结果,当需要这个值时,只需要调用这个对象的get成员函数。

Case


(相关资料图)

std::async允许灵活地传入参数。如果第一个参数是一个指向成员函数的指针,那么第二个参数需要提供这个成员函数所属的类的具体对象——这个对象可以通过指针传递,也可以通过std::ref包装后传递,剩余的参数则将作为成员函数的参数传入。如果第一个参数不是指向成员函数的指针,那么之后的参数都将作为函数的参数传递。

Case

std::async还可以接收一个额外参数(如果有的话,作为第一个参数传入)——std::launch::asyncstd::launch::deferredstd::launch::defered表明函数调用被延迟到waitget函数调用时才执行,std::launch::async表明函数必须在其所在的独立线程上执行, std::launch::deferred | std::launch::async表明实现可以选择这两种方式的一种(默认)。

任务与期望值的绑定

std::packaged_task用于封装一个可调用对象。因为std::packaged_task封装了一个可调用对象,它本身可以被调用,所以可以传递到std::thread对象中,或作为可调用对象传递到另一个函数中,或可以直接进行调用。当std::packaged_task作为一个函数被调用时,其返回值作为异步结果存储在std::future中,可通过get_future获取。

Case 1 :

Case 2 :

执行一个图形界面线程

在传统的多线程编程模型中,如果一个线程需要更新图形界面,它通常需要向特定的图形界面线程发送自定义消息或执行一些复杂的同步操作,以确保界面更新的正确性和线程安全性。但是,使用packaged_task可以简化这个过程。

通过将更新图形界面的任务封装在packaged_task对象中,可以直接将该任务提交给图形界面线程执行,而无需手动发送自定义消息。

这段代码展示了如何使用packaged_task在图形界面线程中执行任务。gui_thread是图形界面线程的入口函数。在这个函数中,首先调用process_message处理消息,然后在互斥锁的保护下访问任务队列。如果任务队列为空,就继续下一轮循环。否则,将任务队列的头部任务移动到局部变量task中,并从任务队列中移除该任务。最后,调用task执行任务。

post_task_for_gui_thread用于向图形界面线程提交任务。它接受一个可调用对象作为参数,并创建一个packaged_task对象来封装该任务。然后通过get_future获取任务的结果。接着在互斥锁的保护下,将任务加入任务队列,并返回任务的future对象。

关键词:

热门推荐
猜你喜欢