के तहत std :: भविष्य को असाइन करते समय क्रैश 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);
}
सांत्वना उत्पादन का कहना है:
च: \ dd \ vctools \ CRT \ crtw32 \ stdcpp \ thr \ mutex.c (51): म्युटेक्स नष्ट जबकि व्यस्त
पूर्ण कॉल स्टैक है: https://pastebin.com/0g2ZF5C1
अब स्पष्ट रूप से यह केवल एक तनाव परीक्षण है, लेकिन क्या मैं कुछ बेवकूफ कर रहा हूं? मुझे ऐसा लगता है यह एक मौजूदा भविष्य के लिए एक नया कार्य पुन: असाइन करने ठीक है, के रूप में यह कहा जाता है कि operator=
:
विज्ञप्ति किसी भी साझा राज्य और * इस
करने के लिए अन्य की सामग्री को ले जाने-प्रदान करती है (http://en.cppreference.com/w/cpp/thread/future/operator%3D के कारण)।
क्या यह एमएसवीसी के रनटाइम में एक बग है?
उल्लेखनीय है, कार्यक्रम अगर मैं मैन्युअल रूप से काम करने से पहले प्रतीक्षा() कहते हैं, इस प्रकार में पाश बनाने दुर्घटनाग्रस्त बंद हो जाता है:
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
बस एक नया सी ++ परियोजना खोला।
एमएसवीसी और कंपाइलर का सटीक संस्करण उपयोगी होगा। – Yakk
बस एक अनुमान: कभी-कभी संभवतः 'एल' अभी भी निष्पादित किया जाता है जब आप f को पुन: असाइन करने का प्रयास करते हैं।शायद डीबग में लैम्ब्डा बनाने का ओवरहेड शेष कोड के डीबग संस्करण के ओवरहेड की तुलना में काफी बड़ा है। यह समझा सकता है कि यह केवल डीबग संस्करण में होता है। –
@Yakk निश्चित रूप से, मैंने सवाल संपादित किया है। –