Aşağıdaki kod, 'un aksine, Debug
modu altında MSVC ile oluşturulduğunda rasgele aralıklarla çöküyor.std :: future'e MSVC'nin Debug modu altında atanırken kilitlenme
#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);
}
çıkış konsolu söyler:
f \ dd \ vctools \ crt \ crtw32 \ stdcpp \ thr \ mutex.c (51): muteksin tahrip ederken yoğun
Tüm çağrı yığını: https://pastebin.com/0g2ZF5C1
Şimdi açıkçası sadece bir stres testi, ama tamamen aptalca bir şey yapıyorum?
Bültenleri paylaşılan durum ve * Bu
diğer içeriğini taşımak-atar: O operator=
söylenir gibi, varolan geleceğe yeni bir görev yeniden atamak için gayet Bana öyle geliyor (http://en.cppreference.com/w/cpp/thread/future/operator%3D'dan dolayı).
MSVC'nin çalışma zamanında bir hata mı?
for (int i = 0; i < 1000000; ++i) {
f.wait();
f = async(launch::async, l);
}
değil operator=
mı kendisi wait
araması gerekiyordu:
Dikkat çekici, elle böylece içine döngü haline atama öncesi bekleme() ararsanız programı kilitleniyor durdurur?
Geçmiş:
_MSC_VER
1911
Kodu yardımıyla inşa edilmiş eşittir:
Microsoft Visual Studio Community 2017 Preview(2)
Version 15.4.0 Preview 2.0
Sadece yepyeni C++ proje açtı.
msvc ve derleyici tam sürümü yararlı olacaktır. – Yakk
Sadece bir tahminde bulunun: Muhtemelen f'yi yeniden denemeye çalışırken muhtemelen 'l' devam ediyor.Muhtemelen, hata ayıklamada lambda oluşturma yükü, kalan kodun hata ayıklama sürümüne göre çok daha büyüktür. Bu sadece hata ayıklama sürümünde olduğunu açıklayabilir. –
@Yakk Tabii, soruyu düzenledim. –