2012-05-15 6 views
2

새로운 C++ 11에서 스레드가 아닌 프로세스가 추가 된 이유가 궁금합니다.다중 플랫폼 다중 처리?

플랫폼 특정 기능에 대한 래퍼를 수행하지 않았습니까?

멀티 프로세싱을 수행하는 가장 휴대 가능한 방법에 대한 제안이 있으십니까? 포크()? OpenMP? 당신 이식이 작업을 수행하려면

+3

스레드가 모든 곳에서 사용되는 이유는 스레드가 프로세스가 아닌 척하는 것일뿐입니다. 당신이 제안한 대안 (pthreads와 openmp)이 두 스레드가 프로세스가 아니기 때문에 오해가있는 것 같습니다. 아마도 [스레딩 모델] (http://en.wikipedia.org/wiki/Thread_%28computing%29#Models)을 프로세스와 혼합하고 있습니까? – Flexo

+0

@awoodland : 당신이 맞아요, 나는 pthread가 아니라 포크() 가족을 의미했습니다. 나는 아직 OpenMP를 보지 않았다. 그것의 이름에서 그것은 다중 처리에 관하여 인 것을 보였다. – Pietro

+1

OpenMP는 일반적으로 pthreads 또는 시스템 스레딩 API가 무엇이든간에 매핑됩니다. OpenMPI는 상황에 따라 프로세스 또는 스레드를 사용하고 세부 정보를 숨 깁니다. – Flexo

답변

0

나는 Boost Interprocess을 사용하고 있습니다.

새 프로세스를 만들 가능성은 없지만 일단 있으면 프로세스를 통해 통신 할 수 있습니다.

이 특별한 경우에는 쉘 스크립트에서 필요한 프로세스를 만들 수 있습니다.

3

내가 직접 fork()를 호출 피하고 대신에이 가능한 시스템 fork()exec()의 조합에 매핑 할 수있는 자신 만의 라이브러리 함수를 작성 건의 할 것입니다. 주의 할 점이 있다면 함수가 Win32에서 CreateProcess()과 동일하거나 유사한 의미를 갖도록 할 수 있습니다.

UNIX 시스템은 Windows 기반 시스템에 비해 프로세스와 프로세스 관리에 상당히 다른 접근 방식을 사용하는 경향이 있으므로 가장 단순한 랩퍼를 제외한 모든 시스템을 이식 할 수 있습니다.

물론 C++ 11이나 부스트를 사용할 수 있다면 나는 그것에 충실 할 것입니다. 어떤 전역 변수 (일반적으로 좋은 점)가없고 다른 방법으로 데이터를 설정하고 공유하지 않으면 최신 시스템의 스레드와 프로세스 간의 실질적인 차이가 거의 없습니다. 생성 한 모든 스레드는 프로세스와 동일한 방식으로 서로 독립적으로 진행할 수 있습니다.

메시지 전달이 작업 또는 일괄 처리 스케줄러 시스템에 적합한 경우 MPI 구현을 볼 수 없다.

+0

"최신 시스템의 스레드와 프로세스 간의 실제 차이는 슬림"- 모든 스레드가 동일한 메모리 세그먼트를 공유한다는 사실은 근본적인 차이가 있어야합니다. – Pietro

+1

@Pietro - 주소 공간의 각 부분이 하나의 스레드에 의해서만 처리되는 경우 개별 프로세스가있는 것과 유사합니다. 당신이 인용 한 진술의 "배경"은 리눅스에서 같은 기본 시스템 호출 ('clone()')에'fork()'와'pthread_create()'가 매핑된다는 것인데, 그래서 한 레벨에서 그들은 구별 할 수 없다.매우 전통적인 프로세스조차도로드하는 공유 객체에 대해 공유 메모리 세그먼트를 갖게됩니다 (읽기/실행 만 매핑 됨). – Flexo

3

Qt를 사용할 수 있다면 QProcess 클래스는 우아한 플랫폼 독립적 인 솔루션이 될 수 있습니다.