ProgramingTip

C ++ 11 퓨처 사용 : std :: async 퓨의 중첩 된 호출 충돌 : 컴파일러 / 표준 라이브러리?

bestdevel 2021. 1. 8. 23:04
반응형

C ++ 11 퓨처 사용 : std :: async 퓨의 중첩 된 호출 충돌 : 컴파일러 / 표준 라이브러리?


프로그램에서 중첩 된 std :: async 호출을 도입 할 때 충돌이 문제를 후 다음 최소 예제 에서 재현 할 수 있습니다 . 자주 충돌하지만 항상 그런 것은 아닙니다. 무엇이 잘못 보십니까? 아니면 컴파일러 또는 표준 라이브러리 버그입니까? get()선물 호출이 추가 되면 문제가 남아 있음을 유의하십시오 .

#include <future>
#include <vector>

int main (int, char *[])
{
    std::vector<std::future<void>> v;
    v.reserve(100);
    for (int i = 0; i != 100; ++i)
    {
        v.emplace_back(std::async(std::launch::async, [] () {
            std::async(std::launch::async, [] { });
        }));
    }

    return 0;
}

두 가지 종류의 충돌을 관찰합니다. (약 5 회 실행시)

  • 와 종료 "이 응용 프로그램은 비정상적인 방식으로 종료 할 가동을 요청했습니다."
  • 'std :: future_error', what () : Promise가 이미 의 인스턴스를 던진 후 종료 합니다.

환경 :

  • 윈도우 7
  • gcc 버전 4.8.2 (i686-posix-dwarf-rev3, MinGW-W64 프로젝트에서 구축), Qt 5.3.2에서 제공됨

  • 명령 줄 호출 : g++ -std=c++11 -pthread futures.cpp
  • 두 개의 독립적 인 컴퓨터에서 실행 및 실행

옵션 -pthread? 어떤 경우에 내 환경에서 옵션 -pthread이 자동으로 고려되지 않을까요? 나는 그 옵션이 있든 없든 같은 행동을 관찰하든.


이 답변은 여전히 ​​"답변이 없습니다."의 일부 사람들과 이야기를 나눈 후 Lounge<C++>, MinGW / MinGW-w64 또는 pthread의 부분에서 구현 오류로 인한 의견을 통해 확실히 명확하게 말할 수 있습니다 . gcc 4.9.1, MinGW-W64를 사용하면 문제가 더 이상하다고합니다. 사실 위의 프로그램 은 POSIX 스레딩을 사용하는 4.8.2 이전 버전의 방송되고 실행되는 소리가 들립니다 .

나 자신은 전문가가 아닙니다. 프로그램이 동일한 약속을 두 번 쓰려고 할 때 정확한 트립이 발생 생각합니다. std :: async와 같이 큰 안된다고 생각합니다. 결과를 한 번만 작성해야합니다 (다시 말하지만 내가 여기에 있는지 확실하지 않은 것 다른 주석 및 편집 내용이 대부분 명확하게 해).

또한 C ++ 0x의 gcc 실험적 구현에 대한 std :: future 예외

참조 URL : https://stackoverflow.com/questions/28604461/using-c11-futures-nested-calls-of-stdasync-crash-compiler-standard-library

반응형