std async 예제


구현 정의 시작 정책의 예로는 동기화 정책(비동기 호출 내에서 즉시 실행) 및 작업 정책(비동기와 유사하지만 스레드-지역 참조가 지워지지 않음)이 std::async가 헤더 상주합니다. #include 지시문에 포함합니다. 동일한 스레드가 std::recursive_mutex를 여러 번 잠글 수 있기 때문에 실행되고 42가 표시됩니다. 시작 정책을 비동기로 전환하면 호출 스레드가 상태를 유지하는 동안 다른 스레드가 std::recursive_mutex를 잠글 수 없기 때문에 프로그램이 교착 상태가 됩니다. 인위적인? 예. 물론, 예 – 이것은 실제 코드에서 발생할 수 있습니다. 당신이 자신에게 생각하는 경우 “그는 바람을 피우고있다, 이 이상한 std::recursive_mutex 예는 특별히 문제를 보여주기 위해 맞춤 …”, 나는 일반 std ::mutex 자신의 문제가 있음을 확신합니다. 잠긴 스레드에서 잠금을 해제해야 합니다. 따라서 작업이 일반 std::mutex대신 main으로 잠긴 경우 문제가 있을 수 있습니다.

다른 스레드에서 뮤텍스잠금을 해제하는 것은 정의되지 않은 동작입니다. 기본 시작 정책을 사용하면 정의되지 않은 동작이 가끔 씩씩한 경우가 있습니다. 사랑 스러운. 실제로 값을 반환하는 다른 예제를 시도해 보겠습니다. 좀 더 흥미롭게 만들기 위해 이번에는 람다를 사용하겠습니다: 간격 [0, 1]의 z(세 번째 차원)의 값에서 1800개의 이미지를 생성합니다. 각 이미지는 std:::비동기 호출에서 make_perlin_noise 함수에 의해 생성됩니다: 이제 예제 자체에. C++를 사용하여 다른 스레드에서 메서드를 실행하는 것이 이보다 쉽지 않을 수 있습니다. 먼저 현재 스레드 ID만 인쇄하는 메서드를 만듭니다.

throw sd::system_error 오류 조건 std:::errc:resource_unavailable_try_again 시작 정책 std:::launch::async 및 구현 새 스레드를 시작할 수 없습니다(정책이 비동기 연기이거나 추가 비트가 설정된 경우 이 경우 지연되거나 구현 정의된 정책으로 대체되거나 내부 데이터 구조에 대한 메모리를 할당할 수 없는 경우 std::bad_alloc로 대체됩니다. 위에 표시된 모든 샘플에서 문제를 우회하기 위해 비동기 정책을 std::async로 명시적으로 전달합니다. 비동기가 지원하는 유일한 정책은 아닙니다. 다른 하나는 연기되고 기본값은 실제로 비동기 | 지연됨을 의미하므로 런타임에 맡기고 결정할 수 있습니다. 우리가 해서는 안된다는 것을 제외하고는. read_tls_var 호출 스레드에서 실행 되므로 실행 될 때 값 50을 표시 합니다. 정책을 std::launch::async로 변경하면 대신 0이 표시됩니다. read_tls_var이 이제 tls_var이 기본으로 50으로 설정되지 않은 새 스레드에서 실행되기 때문입니다. 이제 런타임에서 작업이 동일한 스레드 또는 다른 스레드에서 실행되는지 여부를 결정한다고 가정해 보세요. 이 시나리오에서 TLS 변수는 얼마나 유용합니까? 별로, 불행하게도. 그럼 당신은 비 결정주의와 멀티 스레딩 Heisenbugs을 사랑하지 않는 한 :-) 방금 무슨 일이 일어났나요? 첫 번째 경우 는 호출된_from_async가 실행되기 전에 주 스레드의 메시지가 화면에 인쇄되었으며 두 번째 실행의 경우 호출된 주 스레드와 스레드가 동시에 화면을 사용하려고 했습니다.

Contact Info

Citizens for Yarbrough

1001 S. 17th Ave

Maywood, IL

Phone : (708) 344-7062

Email :