std thread 예제

다음 코드는 각 스레드가 std::cout에 독점적으로 액세스하도록 중요한 섹션을 만드는 방법을 보여 주며: 호출할 수 있는 최대 코어 수를 얻으려면 다음 그림과 같이 std::thread::hardware_cuncurrency() : 한 스레드가 내부에서 실행되는 경우 임계 섹션을 입력하려는 다른 모든 스레드는 기본적으로 차단됩니다. 그래서 우리는 가능한 한 작은 임계 섹션 안에 지침을 유지해야합니다. 설명하기 위해 중요한 섹션 코드의 나쁜 부분은 다음과 같습니다. C++11 멀티스레딩 지원에 대해 배우기 에 대한 좋은 책은 작업 시 C++ 동시성: Anthony Williams의 실용적인 멀티스레딩: 다중 스레드 환경에서는 리소스 또는 공유 데이터에 대해 둘 이상의 스레드가 경쟁하는 경우가 많습니다. 한 번에 하나의 스레드만 작동하도록 허용하는 일부 메커니즘을 사용하여 리소스 또는 데이터를 보호하지 않는 한 리소스 또는 데이터에 대해 정의되지 않은 동작이 발생하는 경우가 많습니다. 여기서 주목해야 할 한 가지 는 이 간단한 코드에서도 공통 리소스인 std::cout을 공유한다는 것입니다. 따라서 코드가 제대로 작동하려면 주 스레드에서 자식 스레드가 리소스에 액세스할 수 있도록 해야 합니다. C++14를 참조로 사용하지만 설명한 내용도 C++17에서 지원됩니다. 나는 일반적인 구문만 다룹니다.

이 프로그램을 읽은 후 자신의 다중 스레드 프로그램을 작성할 수 있어야 합니다. 스레드를 분리한 경우 어떤 시점에서 주 스레드에 다시 조인할 수 없습니다. 이것은 매우 명백한 오류입니다 – 문제가되는 것은 때때로 스레드를 분리 한 다음 수백 줄의 코드를 작성한 다음 동일한 스레드를 조인하려고 할 수 있다는 것입니다. 결국, 누가 그들이 바로 다시 300 라인을 쓴 것을 기억 ? 스레드는 생성자 인수로 제공되는 최상위 함수에서 시작하여 연결된 스레드 개체를 생성즉시 실행을 시작합니다(OS 예약 지연 대기 중). 최상위 함수의 반환 값은 무시되며 예외를 throw하여 종료되는 경우 std::terminate가 호출됩니다. 최상위 함수는 std::promise를 통해 또는 공유 변수를 수정하여 호출자에게 반환 값 또는 예외를 전달할 수 있습니다(동기화가 필요할 수 있음, std::mutex 및 std:atomic 참조) 실수 # 13: std:: 비동기는 std::비sync가 deafult 매개 변수로 시작될 때 수행되며, 이러한 두 정책의 조합으로 인해 동작을 예측할 수 없게 됩니다. std:async 기본 시작 매개 변수를 사용 하 여 함께 태그 하는 다른 합병증의 집합이 있다 – 이들은 포함, 스레드 로컬 변수가 제대로 액세스 하는지 여부를 예측 하는 무 능력, 전혀 실행 되지 않는 위험을 실행 하는 비동기 작업 .get std::async에 의해 반환된 미래가 지연된 상태에서 시작될 수 있기 때문에 미래 상태가 완료되지 않을 때까지 기다리는 모든 코드 경로 및 루프를 따라 호출되지 않을 수 있습니다. C++14는 이러한 경합 조건을 피하기 위해 스레드를 동기화하는 여러 구문들을 제공합니다.

주 프로그램이 종료되기 전에 스레드를 조인하거나 분리하는 것을 잊어버린 경우 프로그램 충돌이 발생합니다. 방법 ReadFifyThousandRecords() 읽기 전용 작업입니다. 잠금 장치 안에 있을 이유가 없습니다. DB에서 50,000개의 레코드를 읽는 데 10초가 걸리면 다른 모든 스레드가 해당 기간 동안 불필요하게 차단됩니다. 이는 프로그램의 처리량에 심각한 영향을 줄 수 있습니다. 분리된 스레드는 주 스레드가 이미 완료되고 종료되어 출력을 stdout으로 인쇄할 수 없습니다. 이것은 다중 스레드 프로그래밍의 특성 중 하나입니다 : 동기화 메커니즘을 사용하지 않는 한 어떤 스레드가 먼저 실행되는지 확신 할 수 없습니다. 이 경우 새 스레드를 만드는 데 걸리는 시간이 있기 때문에 주 스레드는 자식 스레드보다 먼저 완료될 가능성이 높습니다. 두 std::thread 개체는 동일한 실행 스레드를 나타낼 수 없습니다. std::스레드는 복사생성 가능 하거나 Copy할당 가능 하지 않습니다., 비록 그것은 이동 생성 가능 하 고 Move할당.

¡Contactanos!