새로운 C++ 11에서 스레드가 아닌 프로세스가 추가 된 이유가 궁금합니다.다중 플랫폼 다중 처리?
플랫폼 특정 기능에 대한 래퍼를 수행하지 않았습니까?
멀티 프로세싱을 수행하는 가장 휴대 가능한 방법에 대한 제안이 있으십니까? 포크()? OpenMP? 당신 이식이 작업을 수행하려면
새로운 C++ 11에서 스레드가 아닌 프로세스가 추가 된 이유가 궁금합니다.다중 플랫폼 다중 처리?
플랫폼 특정 기능에 대한 래퍼를 수행하지 않았습니까?
멀티 프로세싱을 수행하는 가장 휴대 가능한 방법에 대한 제안이 있으십니까? 포크()? OpenMP? 당신 이식이 작업을 수행하려면
나는 Boost Interprocess을 사용하고 있습니다.
새 프로세스를 만들 가능성은 없지만 일단 있으면 프로세스를 통해 통신 할 수 있습니다.
이 특별한 경우에는 쉘 스크립트에서 필요한 프로세스를 만들 수 있습니다.
내가 직접 fork()
를 호출 피하고 대신에이 가능한 시스템 fork()
및 exec()
의 조합에 매핑 할 수있는 자신 만의 라이브러리 함수를 작성 건의 할 것입니다. 주의 할 점이 있다면 함수가 Win32에서 CreateProcess()
과 동일하거나 유사한 의미를 갖도록 할 수 있습니다.
UNIX 시스템은 Windows 기반 시스템에 비해 프로세스와 프로세스 관리에 상당히 다른 접근 방식을 사용하는 경향이 있으므로 가장 단순한 랩퍼를 제외한 모든 시스템을 이식 할 수 있습니다.
물론 C++ 11이나 부스트를 사용할 수 있다면 나는 그것에 충실 할 것입니다. 어떤 전역 변수 (일반적으로 좋은 점)가없고 다른 방법으로 데이터를 설정하고 공유하지 않으면 최신 시스템의 스레드와 프로세스 간의 실질적인 차이가 거의 없습니다. 생성 한 모든 스레드는 프로세스와 동일한 방식으로 서로 독립적으로 진행할 수 있습니다.
메시지 전달이 작업 또는 일괄 처리 스케줄러 시스템에 적합한 경우 MPI 구현을 볼 수 없다.
"최신 시스템의 스레드와 프로세스 간의 실제 차이는 슬림"- 모든 스레드가 동일한 메모리 세그먼트를 공유한다는 사실은 근본적인 차이가 있어야합니다. – Pietro
@Pietro - 주소 공간의 각 부분이 하나의 스레드에 의해서만 처리되는 경우 개별 프로세스가있는 것과 유사합니다. 당신이 인용 한 진술의 "배경"은 리눅스에서 같은 기본 시스템 호출 ('clone()')에'fork()'와'pthread_create()'가 매핑된다는 것인데, 그래서 한 레벨에서 그들은 구별 할 수 없다.매우 전통적인 프로세스조차도로드하는 공유 객체에 대해 공유 메모리 세그먼트를 갖게됩니다 (읽기/실행 만 매핑 됨). – Flexo
Qt를 사용할 수 있다면 QProcess
클래스는 우아한 플랫폼 독립적 인 솔루션이 될 수 있습니다.
스레드가 모든 곳에서 사용되는 이유는 스레드가 프로세스가 아닌 척하는 것일뿐입니다. 당신이 제안한 대안 (pthreads와 openmp)이 두 스레드가 프로세스가 아니기 때문에 오해가있는 것 같습니다. 아마도 [스레딩 모델] (http://en.wikipedia.org/wiki/Thread_%28computing%29#Models)을 프로세스와 혼합하고 있습니까? – Flexo
@awoodland : 당신이 맞아요, 나는 pthread가 아니라 포크() 가족을 의미했습니다. 나는 아직 OpenMP를 보지 않았다. 그것의 이름에서 그것은 다중 처리에 관하여 인 것을 보였다. – Pietro
OpenMP는 일반적으로 pthreads 또는 시스템 스레딩 API가 무엇이든간에 매핑됩니다. OpenMPI는 상황에 따라 프로세스 또는 스레드를 사용하고 세부 정보를 숨 깁니다. – Flexo