auto fut = std::async(std::future::async, f);
이렇게 하면 첫번째 파라미터로 명시한 정책대로 논블락킹인데
std::async(std::future::async, f);
이렇게 리턴값을 변수에 저장하지않하면 블락킹되네요
왜 그런지 찾아보니 퓨처객체를 std::async가 리턴했으나 변수에 저장하지 않아 바로 파괴자가 호출되는데
이 파괴자가 f의 실행이 완료될 때까지 블락시키네요
왜 리턴값에 관심이 없는 경우에도 억지로 변수를 하나 써야하는지 모르겠어요
[정보] std::async가 반환하는 퓨처의 동작이 직관이랑은 좀 다르네요
moumou(moumou)
2019-01-03 22:18
추천 0
댓글 9
다른 게시글
-
아 한글과컴퓨터 쓰레기같은 기업 진짜 뷰어하나 깔았다고 [4][%] 익명(121.174) | 19.01.03추천 3
-
여기 갤러들은 PDF로 공부하는거 좀 익숙함? [1][%] 뽕맞은펭귄(121.165) | 19.01.03추천 0
-
파이썬 초심자에게 가르치면 좋은데 [8][%] 0xrgb(0xrgb) | 19.01.03추천 2
-
러스트에 protobuf 메세지 처리하는 웹 서버 만들려면 [1][%] Recursion(recursion) | 19.01.03추천 0
-
ML쪽 해보면 좋은게 [5][%] ㅇㄹ(rerereq) | 19.01.03추천 0
-
더러운 Rust 갤러리 [2][%] 익명(121.174) | 19.01.03추천 0
-
C->C++->Rust로만 넘어가도 됨 [4][%] 다메즈마(115.21) | 19.01.03추천 0
-
시뿔뿔 STL 질문 하나만 [4][%] 익명(123.141) | 19.01.03추천 0
-
Rust 다른 언어로 한단계씩 배우는 테크트리 [5][%] ㅇㄹ(rerereq) | 19.01.03추천 0
-
이런 건 대체 무슨 문젤까 [2][%] 나니킷(nanikit) | 19.01.03추천 0
해당 댓글은 삭제되었습니다.
네 정확히는 저 퓨처를 들고 있는 마지막 객체의 파괴자가 블락시켜 작업이 완료될 때까지 스레드가 종료되는 걸 막아주는 역할이던데, 제가 경험한 타 언어에서는 그걸 강제하지 않은 경우였어서 좀 당황스러웠고, 그거랑 상관 없이 그냥 안 쓸 변수가 있다는 것 자체가 영 거시기하기네요
아 그러고보니 언어를 안 썼네요 C++입니다 코드가 짧아서 다른 언어에도 있을법한 문법 같네요
아나 pthread기반으로 표준라이브러리를 쓴 것이기 때문에 표준 스레드 클래스도 명시적으로 detach안해주면 join하라 에러냄
아 애초에 리턴된 걸 무조건 관리해줘야하는 라이브러리를 기반으로했기 때문에 얘도 그에 해당하는 작업을 파괴자에서 해줘야한다는 거군요
그런 거 같음, 윈도우API는 메인스레드가 죽으면 자식스레드도 죽이는데, pthread라이브러리는 아니기 때문에 그런게 아닐까... 란 생각을 해봄
그냥 thread에서는 임시객체에 바로 detach 메소드를 실행시켜서 넘어갈 수 있었는데 future는 레퍼런스보니 따로 없는 것 같네 ㅋㅋ
future 는 애초에 그렇게 쓰라고 만든 물건인데요;; 리턴값이나 블로킹 시점 관리하는거에 관심 없으면 그냥 std::thread 쓰세요 - return 0;
애초에 future 의 목적 자체가 그런거니까 불만 갖는 님이 이상한거 - return 0;