실수 # 2 : 이전에 분리 된 스레드를 조인하려고st::async를 사용하는 또 다른 큰 장점은 std:::future 개체를 통해 호출 스레드로 다시 전달 된 작업의 결과를 얻을 수있는 기능입니다. 예를 들어 int를 반환하는 ConjureMagic 함수가 있다고 가정하면 작업이 완료되면 미래를 설정하는 비동기 작업을 회전할 수 있으며 적절한 시기에 호출 스레드에서 미래의 결과를 추출할 수 있습니다. 나는 스레드를 만드는 데 필요한 대부분의 것을 다루었다. 여기에 포함되지 않은 몇 가지 다른 세부 사항이 있지만 직접 연구 할 수 있습니다 : 실수 # 17 : 스레드 실행에 대한 세부 적인 제어가 필요할 때 std::async를 사용하면 새로운 C ++ 멀티 스레딩 구문은 배우기가 매우 쉽습니다. C 또는 C++에 익숙하고 다중 스레드 프로그램 작성을 시작하려는 경우이 문서는 적합합니다! 2. 메인 스레드에서 스레드 t1을 분리하고 우리가 CallHome 함수에서 뮤텍스의 잠금을 해제하는 것을 잊어 버린 경우, 우리의 장난감 예에서 데몬 스레드로 계속하자, 우리는 스레드 t1에서 첫 번째 메시지를 인쇄하고 프로그램이 중단됩니다. 이는 스레드 t1이 뮤텍스를 잡고 다른 모든 스레드가 기본적으로 뮤텍스를 획득하기를 기다리고 있기 때문입니다. std:atomic을 사용하여 간단한 bool 또는 정수 카운터와 같은 업데이트가 필요한 간단한 데이터 형식이 있는 경우 뮤텍스를 사용하는 것보다 성능이 거의 향상됩니다. 멤버 함수는 연결된 스레드 개체의 ID, 즉 변수 형식 선언 앞에 있는 “volatile” 키워드가 해당 변수 원자성 또는 스레드에 대한 작업을 어떤 식으로든 안전하게 만들지 않습니다. 당신이 아마 원하는 것은 std::atomic입니다.

문자열이 실제로 참조로 전달되도록 하기 위해 스레드 함수의 끝에 있는 메시지를 수정했습니다. 그러나 출력이 변경되지 않았습니다. 실수 # 12: 백그라운드 스레드에서 예외를 처리 하지 하지만 우리는 그것을 이동 하 여 스레드의 소유권을 전송할 수 있습니다.: 뮤 텍스를 두 번 취득 하려고 하면 정의 되지 않은 동작이 발생 합니다. 대부분의 디버그 구현에서는 충돌이 발생할 수 있습니다. 예를 들어, 아래 코드에서 LaunchRocket()은 뮤텍스를 잠그고 StartThruster()를 호출합니다. 흥미로운 것은 일반 코드 경로에 문제가 없다는 것입니다 – 예외 코드 경로가 트리거될 때만 문제가 발생하며, 이 경우 정의되지 않은 상태/충돌이 발생합니다. 예를 들어 GUI 응용 프로그램에서 완료되는 작업자 스레드는 UI 스레드에 메시지를 게시할 수 있습니다. UI 스레드 자체에는 마우스 이동, 단추 클릭 등과 같은 메시지를 처리하는 메시지 루프가 있습니다. 이 메시지 루프는 작업자 스레드에서 메시지를 수신할 수도 있으며 차단 조인 호출을 할 필요 없이 이에 대응할 수 있습니다. 위의 프로그램은 충돌하고 main()의 캐치 블록은 throw된 스레드 t1의 예외를 처리하기 위해 아무 것도 하지 않습니다.

반대로 작업자 스레드에서 호출 스레드로 결과를 되돌리는 것은 훨씬 더 번거롭습니다. 두 가지 옵션은 다음과 같습니다: C ++11 멀티 스레딩 – 파트 9: std::비동기 자습서 및 참조 된 예외를 다시 throw 하는 경우 참조 된 예외를 처음에 참조 된 예외를 생성 하는 동일한 스레드에서 수행할 필요가 없습니다., 이 기능을 완벽 하 게 만드는 다른 스레드에서 예외를 처리하는 데 적합합니다. 이것은 std:::thread의 native_handle을 사용하고 Win32 스레드 API 함수에 전달함으로써 가능합니다. Std:::thread 또는 std::비동기에 노출되지 않는 Win32 스레드 API를 통해 노출된 다른 많은 기능이 있습니다. std::Async는 이러한 기본 플랫폼 기능에 액세스할 수 없게 하여 보다 정교한 작업에 적합하지 않습니다. 두 std::thread 개체는 동일한 실행 스레드를 나타낼 수 없습니다. std::스레드는 복사생성 가능 하거나 Copy할당 가능 하지 않습니다., 비록 그것은 이동 생성 가능 하 고 Move할당. std::thread::id는 객체이며 콘솔에서도 비교하고 인쇄할 수 있습니다. 예를 들어 스레드 그룹이 리소스를 공유하는 방법을 동기화하거나 스레드에 별도의 데이터 구조를 사용할 수 있는 코드의 장벽(std::mutex)을 사용하여 위의 문제 중 일부를 방지할 수 있습니다. 가능하면.

Scroll Up