2017-10-15 6 views
0

현재 OOP를 사용하여 Airport를 디자인하는 프로젝트를 진행 중입니다. 나는 C++을 사용하고있다. 내 비행기에서 착륙 할 수있는 활주로 번호를 지정하는 RequestLanding() 함수가있는 내 Airport 객체가 있습니다. 이 함수는 두 열거 형 중 하나를 반환합니다 .- 대기 중이거나 진행 중이면 비행기가 착륙할지 여부를 나타냅니다.Openmp thread sleep

외부에서 착륙 요청을하는 많은 비행기 물체가 있습니다. 총 비행기 개체 수에 대해 for 루프를 사용하고 있습니다. 병렬 루프에 OpenMp를 사용하고 있습니다. RequestLanding() 함수가 상태를 반환하고 다시 시도 할 때 openmp sleep의 스레드를 3 초 동안 만들고 싶었습니다.

이 방법이 있습니까? 누군가 간단한 예제를 제공 할 수 있습니까? 미리 감사드립니다.

+0

수면보다 'yield'래터를 사용하지 않는 이유는 무엇입니까? – user0042

+0

@ user0042'std :: this_thread :: yield'를 의미한다고 가정 할 때 - 나는 이것을 강력히 추천한다. 리눅스에서는'sched_yield'에 매핑되고'sched_yield'는 엄격한 루프에서 호출하기에는 적합하지 않은 방식으로 구현됩니다. https://stackoverflow.com/q/6807929/620382도 참조하십시오. – Zulan

답변

1

아주 나쁠 일을하려고하는 것 같습니다.

실제로 무엇을하고 있는지 알지 못하는 한 수면 상태에서 또는 수면 상태에서 수동으로 폴링 (조건을 반복적으로 확인)해서는 안됩니다. 대신 준비 상태를 알리기 위해 조건 변수와 같은 적절한 구문을 사용하십시오. 특정 옳은 방법은 구체적인 사용 사례에 달려 있습니다.

OpenMP에서 스레드는 루프 반복과 같은 여러 작업을 처리하는 작업자입니다. 당신이 처리해야 할 다른 것들 (루프 반복, 비행기)을 지연시킬 때 불필요한 지연을해서는 안됩니다.

OpenMP에서 작업은 항공기 객체를 처리하는 데 약간 더 적합합니다. 그러나 작업에는 종속성이있을 수 있지만 형제 작업 또는 루프 반복 사이에만 있으므로 작업에 도움이되지 않습니다. OpenMP 작업에서 taskyield을 사용할 수도 있습니다. 그러나 가정을 할 때 매우주의해야합니다.

예를 들어 상황이 심각하게 잘못 될 수 있습니다. 각 비행기에 대한 스레드가 있고 std::this_thread::yield이므로 sched_yield을 호출하여 조건을 확인하십시오. 차단 된 비행기로 다른 항공기가 CPU를 사용할 수 있다고 생각할 수 있습니다. 너는 틀릴거야. 현재 Linux 스케줄러는 차단 된 비행기에 실제 작업을 수행하려는 사람과 동일한 CPU 시간을 제공합니다. omp taskyield이 더 나은 방법으로 구현되기를 기대하지만, 그럴 가치는 없습니다.

동시에 어떤 형태로든 sleep을 호출하면 인공 지연이 발생합니다.