jjzjj

c++ - 在 MSVC 的 Debug模式下分配给 std::future 时崩溃

coder 2024-02-05 原文

Release 不同,在 Debug 模式下使用 MSVC 构建时,以下代码会随机崩溃。

#include <future>

using namespace std;

int main() {
    auto l = [](){};
    auto f = async(launch::async, l);

    for (int i = 0; i < 1000000; ++i)
        f = async(launch::async, l);
}

控制台输出显示:

f:\dd\vctools\crt\crtw32\stdcpp\thr\mutex.c(51): mutex destroyed while busy

完整的调用栈是:https://pastebin.com/0g2ZF5C1

现在显然这只是一个压力测试,但我是不是在做一些非常愚蠢的事情?在我看来,将新任务重新分配给现有的 future 很好,因为它说 operator=:

Releases any shared state and move-assigns the contents of other to *this

(由于 http://en.cppreference.com/w/cpp/thread/future/operator%3D )。

它是 MSVC 运行时的错误吗?

值得注意的是,如果我在赋值之前手动调用 wait(),程序将停止崩溃,从而使循环变为:

for (int i = 0; i < 1000000; ++i) {
    f.wait();
    f = async(launch::async, l);
}

难道 operator= 本身不应该调用 wait 吗?

背景:

_MSC_VER 等于 1911

代码是在以下帮助下构建的:

Microsoft Visual Studio Community 2017 Preview(2)
Version 15.4.0 Preview 2.0

刚刚打开了一个全新的 C++ 项目。

最佳答案

Isn't operator= itself supposed to call wait?

我不知道它是否应该,但粗略地看了一下 <future> 的 MSVC15.3.4 实现。似乎强烈暗示它没有。

//User Code
future f = /*...*/;
f = /*...*/; //(1)
//MSVC Code
future& operator=(future&& _Right) _NOEXCEPT //(1)
    {   // assign from rvalue future object
    _Mybase::operator=(_STD move(_Right)); //(2)
    return (*this);
    }
_State_manager& operator=(_State_manager&& _Other) //(2)
    {   // assign from rvalue _Other
    _Move_from(_Other); //(3)
    return (*this);
    }
void _Move_from(_State_manager& _Other) //(3)
    {   // move stored associated asynchronous state object from _Other
    if (this != _STD addressof(_Other))
        {   // different, move
        if (_Assoc_state)
            _Assoc_state->_Release(); //(4)
        _Assoc_state = _Other._Assoc_state;
        _Other._Assoc_state = 0;
        _Get_only_once = _Other._Get_only_once;
        }
    }
void _Release() //(4)
    {   // decrement reference count and destroy when zero
    if (_MT_DECR(_Refs) == 0)
        _Delete_this(); //(5)
    }
void _Delete_this() //(5)
    {   // delete this object
    if (_Deleter)
        _Deleter->_Delete(this); //External Code
    else
        delete this;
    }

视作呼唤wait帮助同步事物并确保 future对象处于可以修改的安全状态,最好包含 wait陈述。

关于c++ - 在 MSVC 的 Debug模式下分配给 std::future 时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46245956/

有关c++ - 在 MSVC 的 Debug模式下分配给 std::future 时崩溃的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  4. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  5. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  6. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  7. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  8. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  9. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  10. ruby-on-rails - environment.rb 中设置的常量在开发模式中消失 - 2

    了解Rails缓存如何工作的人可以真正帮助我。这是嵌套在Rails::Initializer.runblock中的代码:config.after_initializedoSomeClass.const_set'SOME_CONST','SOME_VAL'end现在,如果我运行script/server并发出请求,一切都很好。然而,在我的Rails应用程序的第二个请求中,一切都因单元化常量错误而变得糟糕。在生产模式下,我可以成功发出第二个请求,这意味着常量仍然存在。我已通过将以上内容更改为以下内容来解决问题:config.after_initializedorequire'some_cl

随机推荐