加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – VS2015 std :: async很奇怪

发布时间:2020-12-16 10:07:13 所属栏目:百科 来源:网络整理
导读:在VS2015的下面代码中,我在第一行获得了acefbd,这是正确的.但在第二次测试中,我分成单独的行,输出是abcdef. 这是预期的行为吗? #include future#include iostreamusing namespace std;void a () {std::cout "a";std::this_thread::sleep_for (std::chrono::
在VS2015的下面代码中,我在第一行获得了acefbd,这是正确的.但在第二次测试中,我分成单独的行,输出是abcdef.

这是预期的行为吗?

#include <future>
#include <iostream>

using namespace std;

void a () {
std::cout << "a";
std::this_thread::sleep_for (std::chrono::seconds (3));
std::cout << "b";
}

void c () {
std::cout << "c";
std::this_thread::sleep_for (std::chrono::seconds (4));
std::cout << "d";
}

void e () {
std::cout << "e";
std::this_thread::sleep_for (std::chrono::seconds (2));
std::cout << "f";
}

int main () 
{
    std::async (std::launch::async,a),std::async (std::launch::async,c),e);

cout << "n2nd Test" << endl;

std::async (std::launch::async,a);
std::async (std::launch::async,c);
std::async (std::launch::async,e);

}

解决方法

这与Visual Studio无关,而是与std :: async返回的 std::future对象有关.

当std :: future对象被破坏时,the destructor会在等待未来准备就绪时阻塞.

第一行发生的是你创建三个未来的对象,并在完整表达式的末尾(在你创建最后一个之后),期货超出范围并被破坏.

在“第二次测试”中,你创造了一个未来,然后必须在继续之前被破坏,然后你创造另一个必须在继续之前被破坏的未来,最后是第三个未来当然也必须被破坏.

如果在临时变量的第二个测试中保存期货,则应该得到相同的行为:

auto temp_a = std::async (std::launch::async,a);
auto temp_c = std::async (std::launch::async,c);
auto temp_e = std::async (std::launch::async,e);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读