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);
}
하지 operator=
그 자체는 wait
를 호출하는 가정 :
놀랍게도 내가 수동 따라서으로 루프를 만들고, 할당하기 전에 대기()를 호출하면 프로그램이 충돌을 중지?
배경 :
_MSC_VER
이 1911
코드가의 도움으로 지어진 같습니다 :
Microsoft Visual Studio Community 2017 Preview(2)
Version 15.4.0 Preview 2.0
그냥 새로운 C++ 프로젝트를 열었습니다.
msvc 및 컴파일러의 정확한 버전이 유용 할 것입니다. – Yakk
추측 : f를 재 지정하려고 할 때 'l'이 여전히 실행되는 경우가 있습니다.아마도 디버그에서 람다를 만드는 오버 헤드는 나머지 코드의 디버그 버전의 오버 헤드와 비교할 때 훨씬 큽니다. 디버그 버전에서만 발생한다고 설명 할 수 있습니다. –
@Yakk 물론이 질문을 편집했습니다. –