반응형
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와 같이 큰 안된다고 생각합니다. 결과를 한 번만 작성해야합니다 (다시 말하지만 내가 여기에 있는지 확실하지 않은 것 다른 주석 및 편집 내용이 대부분 명확하게 해).
반응형
'ProgramingTip' 카테고리의 다른 글
프로그래밍 방식으로 Whatsapp 연락처 새로 고침 (0) | 2021.01.08 |
---|---|
기기에서 읽은 Android USB 호스트 (0) | 2021.01.08 |
연결 실패 [ilink32 오류] 치명적 : 'TYPES.OBJ'파일을 열 수 없습니다. (0) | 2021.01.08 |
Windows Phone 8의 UDP 멀티 캐스트 그룹 (0) | 2021.01.08 |
Android에서 NestedScrolling을 구현하는 방법은 무엇입니까? (0) | 2021.01.08 |