Release
とは異なり、Debug
モードでMSVCを使用してビルドすると、次のコードがランダムな間隔でクラッシュします。MSVCのデバッグモードでstd :: futureに割り当てるときのクラッシュ
#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): ビジー
フルコールスタックは次のとおりです。https://pastebin.com/0g2ZF5C1
明らかにストレステストですが、私はまったく愚かなことをしていますか?
リリース任意の共有状態と *この
に他の内容を移動するには、割り当て:operator=
と言っていますとして、それは、既存の未来に新しいタスクを再割り当てする罰金です私には思えます(http://en.cppreference.com/w/cpp/thread/future/operator%3Dのため)。
MSVCのランタイムのバグですか?私は手動ためにループを作り、割り当ての前に()の待機を呼び出す場合
驚くべきことに、プログラムがクラッシュを停止する:
for (int i = 0; i < 1000000; ++i) {
f.wait();
f = async(launch::async, l);
}
自体がwait
を呼び出すことになってoperator=
ませんか?コードはの助けを借りて建設された1911
_MSC_VER
等しい:
背景
Microsoft Visual Studio Community 2017 Preview(2)
Version 15.4.0 Preview 2.0
ただ、ブランドの新しいC++プロジェクトを開きました。
正確なバージョンのmsvcとコンパイラが便利です。 – Yakk
ちょうど推測:あなたがfを再割り当てしようとしているうちに、たぶん 'l'が実行されていることがあります。おそらく、デバッグ時にラムダを作成するオーバーヘッドは、残りのコードのデバッグバージョンのオーバーヘッドに比べてはるかに大きくなります。これは、デバッグバージョンでのみ発生することを説明することができます。 –
@ヤク確かに、私は質問を編集しました。 –