2016-07-13 2 views
0

Linux에서 g ++ 컴파일러를 사용하고 있습니다 (가상 상자의 우분투). 나는 생성 후 std :: threads에 적절하게 참여하려고한다. do는 한 번에 시작하는 것처럼 보이지만 계속해서 하나씩 끝납니다. 총 실행 시간은 단일 스레드 시간의 n 배입니다. 나는이 문제를 pthreads와 함께 보지 못했다. Pthreads는 완벽하게 확장되며 실행 시간은 단일 스레드 시간의 (1/n) 배입니다.linux/mac OS에서 C++ 스레드가 병렬 실행되지 않음

Mac OS에서 clang ++ 컴파일러와 동일한 동작을 관찰했습니다.

std :: thread는 'join'이 호출 될 때만 실행될 수 있습니까? std :: thread 생성자에서 추가 매개 변수를 전달하여 병렬로 실행하도록해야합니까? C++ 11 설명서를 검색하여 명백한 이유를 찾을 수 없습니다.

도움을 주시면 감사하겠습니다.

+1

[MCVE] (http://stackoverflow.com/help/mcve)? –

+0

표준에서는 'std :: thread'의 개별 인스턴스가 병렬로 실행될 것을 요구하지 않고, 오직 병렬로 실행되는 _possibility_를 제공합니다. 주 스레드에서 잠을 자면 어떻게되는지보십시오. – Tim

+0

언제'join()'을 부를까요? "생성 후"호출하면 호출 스레드가 새로 작성된 스레드 완료를 기다리게합니다. –

답변

0

질문에 약간의 차이가 있습니다. 그러나 귀하의 질문에 대답하십시오. 예, 스레드가 join으로 호출 될 때 스레드가 실행될 수 있습니다. 그러나 그것은 매우 희박합니다.

join() 함수는 스레드 실행이 완료되면 반환됩니다. 함수 A()가 별도의 스레드에서 함수 B()를 시작하고 함수 A()에서 스레드를 조인하면 B()가 실행을 완료 할 때까지 A()의 실행이 조인 지점에서 중지됩니다 . http://www.cplusplus.com/reference/thread/thread/join/

스레드 실행이 완료되면 함수 리턴에 따르면

. 이 함수는 스레드에서 모든 작업이 완료 될 때이 함수가 반환하는 순간을 동기화합니다.이 함수는 호출 할 함수가 반환 될 때까지이 함수를 호출하는 스레드의 실행을 차단합니다 (아직 수행하지 않은 경우).

또 다른 제안은 프로세스를 분리하고 결과를 빠르게 얻는 지 확인하는 것입니다. 이렇게하면 문제를 확인하는 데 도움이됩니다. 즉, join()이 문제를 일으키는 경우에 도움이됩니다.

관련 문제