【BOOST C++ 13 并行编程】(4) Futures和 Promises线程
admin
2024-04-09 12:33:06
0

一、说明

        Futures 和 Promises 是将数据从一个线程传递到另一个线程的工具。虽然这也可以通过其他功能来完成,例如全局变量、futures 和 promises 在没有它们的情况下也能工作。此外,您不需要自己处理同步。

        未来是一个从另一个线程接收值的变量。如果您访问未来以获取值,您可能需要等到其他线程提供该值。 Boost.Thread 提供 boost::future 来定义未来。该类定义了一个成员函数 get() 来获取值。 get() 是一个阻塞函数,可能需要等待另一个线程。

        要在未来设置一个值,您需要使用一个承诺,因为 boost::future 不提供成员函数来设置一个值。

二、示例

        Boost.Thread 提供类 boost::promise,它有一个成员函数 set_value()。您总是将 future 和 promise 成对使用。您可以使用 get_future() 从承诺中获得未来。您可以在不同的线程中使用未来和承诺。如果在一个线程中的 promise 中设置了一个值,则可以在另一个线程中从 future 中获取它。

        示例 44.14。使用 boost::future 和 boost::promise

#define BOOST_THREAD_PROVIDES_FUTURE
#include 
#include 
#include 
#include void accumulate(boost::promise &p)
{int sum = 0;for (int i = 0; i < 5; ++i)sum += i;p.set_value(sum);
}int main()
{boost::promise p;boost::future f = p.get_future();boost::thread t{accumulate, std::ref(p)};std::cout << f.get() << '\n';
}

Example 44.14

        示例使用未来和承诺。未来 f 是从承诺 p 中接收到的。然后将对 promise 的引用传递给执行 accumulate() 函数的线程 t。 accumulate() 计算 0 到 5 之间所有数字的总和并将其保存在 promise 中。在 main() get() 中调用 future 将总数写入标准输出。

        未来 f 和承诺 p 是相关联的。当对未来调用 get() 时,将返回使用 set_value() 存储在承诺中的值。因为该示例使用两个线程,所以可能会在 accumulate() 调用 set_value() 之前在 main() 中调用 get()。在这种情况下,get() 会阻塞,直到使用 set_value() 将一个值存储在 promise 中。

        示例 44.14 显示 10。

        accumulate() 必须调整为在线程中执行。它必须采用 boost::promise 类型的参数并将结果存储在其中。示例 44.15 引入了 boost::packaged_task,这是一个将值从任何函数转发到未来的类,只要该函数通过 return 返回结果即可。

        示例 44.15。使用 boost::packaged_task

#define BOOST_THREAD_PROVIDES_FUTURE
#include 
#include 
#include 
#include int accumulate()
{int sum = 0;for (int i = 0; i < 5; ++i)sum += i;return sum;
}int main()
{boost::packaged_task task{accumulate};boost::future f = task.get_future();boost::thread t{std::move(task)};std::cout << f.get() << '\n';
}

Example 44.15

        示例 44.15 与前一个类似,但这次没有使用 boost::promise。相反,此示例使用类 boost::packaged_task,它与 boost::promise 一样提供返回未来的成员函数 get_future()。

        boost::packaged_task 的构造函数期望将在线程中执行的函数作为参数,但 boost::packaged_task 本身并不启动线程。必须将类型为 boost::packaged_task 的对象传递给 boost::thread 的构造函数,以便在新线程中执行该函数。

        boost::packaged_task 的优点是它在未来存储函数的返回值。你不需要调整一个函数来在未来存储它的值。 boost::packaged_task 可以看作是一个适配器,它可以存储未来任何函数的返回值。

        虽然该示例摆脱了 boost::promise,但以下示例也没有使用 boost::packaged_task 和 boost::thread。

        示例 44.16。使用 boost::async()

#define BOOST_THREAD_PROVIDES_FUTURE
#include 
#include 
#include int accumulate()
{int sum = 0;for (int i = 0; i < 5; ++i)sum += i;return sum;
}int main()
{boost::future f = boost::async(accumulate);std::cout << f.get() << '\n';
}

        在示例 44.16 中,accumulate() 被传递给函数 boost::async()。这个函数统一了 boost::packaged_task 和 boost::thread。它在新线程中启动 accumulate() 并返回未来。

        可以将启动策略传递给 boost::async()。这个附加参数决定了 boost::async() 是在新线程中还是在当前线程中执行该函数。如果您传递 boost::launch::async,boost::async() 将启动一个新线程;这是默认行为。如果您传递 boost::launch::deferred,该函数将在调用 get() 时在当前线程中执行。

        尽管 Boost 1.56.0 允许将 boost::launch::async 或 boost::launch::deferred 传递给 boost::async(),但尚未实现在当前线程中执行函数。如果您传递 boost::launch::deferred,程序将终止。

相关内容

热门资讯

觉得慕然家居怎么样? 觉得慕然家居怎么样?我在去年双十一买的慕然的家具,床、床头柜、梳妆台,全是慕然的,整体摆放效果好看,...
益禾堂的冰淇凌怎么样? 益禾堂的冰淇凌怎么样?益禾堂是大品牌品质值得放心,而且性价比高、口感不错∞我非常的喜欢吃他们家的冰激...
老年人怎样养生,才能让自己获得... 老年人怎样养生,才能让自己获得健康长寿呢?平时少吃油腻,多吃清淡的蔬菜,注意保证蛋白质的摄入,多喝水...
〖好听的情歌对唱〗 〖好听的情歌对唱〗麻烦各位推荐一下能在ktv和她/他对唱的好的情歌,深情,可爱的都行,谢谢!好多拉~...
驾驶汽车长途短途和中途是怎样区... 驾驶汽车长途短途和中途是怎样区分的短途是2小时以内,中途是4小时以内,长途是6小时以上的驾驶时间在1...
为什么很多很相爱的人却无法生活... 为什么很多很相爱的人却无法生活在一起呢?因为除了相爱之外,还有很多因素影响着,比如父母的阻挠、生活背...
男人如何释放性压力 男人如何释放性压力男生与女生不一样的是,当男生有压力时,并不会像女生那样大闹大吃一场,而是压抑自己。...
“中国人是不好惹的,惹急了是不... “中国人是不好惹的,惹急了是不好办的”用英语怎么说不过我觉得这个问题...好像有损国际友谊和中国人的...
迪士尼冷门公主,童年回忆,令人... 迪士尼冷门公主,童年回忆,令人回味?
请推荐几本韩语书 请推荐几本韩语书가시고기 看看吧 很感人
遇到一个超越理想型的男人,可他... 遇到一个超越理想型的男人,可他不爱我,我放不下、走不出来,一想到他就心疼,咋办?遇到一个超理想型的男...
男生向女生表白后,女生说其实我... 男生向女生表白后,女生说其实我也喜欢你的,男生有泪无声地哭了,这是为什么?名花有主..... ...
暮色安然下一句 暮色安然下一句解百忧。根据作者清谷轩写的七律诗《母亲》中,扶梯捧我云天外,暮色安然解百忧。暮色安然解...
永不消逝的电波结局真感伤啊… 永不消逝的电波结局真感伤啊…唉,真好看,为什么主人公结局会这样?谁让革命就是那样呀!!! 悲惨啊今天...
一群人打游戏而获得超能力的电影 一群人打游戏而获得超能力的电影超能游戏者 Геймеры. В поисках цели (2009...
用冰糖和梨煮在一起可以治咳嗽吗 用冰糖和梨煮在一起可以治咳嗽吗冰糖和雪梨在一起煮水喝,是可以在一定程度上缓解咳嗽的,主要有以下功效:...
孩子在幼儿园被老师歧视了 孩子在幼儿园被老师歧视了一.小时候被老师歧视可能有多种原因,以下是一些常见的情况:1.行为问题:某些...
美国喜剧电影里有一个学生经被欺... 美国喜剧电影里有一个学生经被欺负,然后他发誓变成一个坏蛋,然后被学校开除。而且还进过监狱。狱中豪杰 ...
女生喜欢抽烟和喝酒,是不是不好... 女生喜欢抽烟和喝酒,是不是不好的习惯?虽然我不抽烟,但我会喝酒,而且酒量不比男生差,所以我并不认为女...
本科女生愿意和一个大专男生谈恋... 本科女生愿意和一个大专男生谈恋爱?谈恋爱的阶段,不分本来还是大专,本科女生愿意和大专男生只要感情处得...