2014-02-25 3 views
1

항상 공유 메모리가 두 스레드간에 데이터를 공유하는 가장 빠른 방법이라는 것을 알게되었습니다 (예 : http://www.boost.org/doc/libs/1_55_0/doc/html/interprocess.html). 그러나 오늘 나는 boost::ref(X)을 사용하여 boostX에 대한 참조를 제공하여 스레드 외부에서 X에 액세스 할 수 있음을 발견했습니다. 항상 이렇게 할 수 그들이 필요로하는 대부분의 응용 프로그램은 자신의 스레드를 생성하기 때문에이 방법이 훨씬 쉬워 보인다 - 대부분의 응용 프로그램 - setSomeMember은 다음 스레드 안전 가정 : 따라서 다음 의사 작동합니다 :프로세스 간 통신 : 공유 메모리와 스레드 개체 액세스

MyObjext X(para1,para2); // MyObject has a() operator 
boost::thread thr(boost::ref(X)); 
X.setSomeMember(1); 

을이 날 생각하고 있어요 객체 X을 저장하고 액세스하십시오. 그렇다면 왜 스레드 객체에 직접 액세스 할 수 있다면 공유 메모리 또는 메시지 대기열을 사용할 수 있습니까? 어쩌면 더 빠를까요? 아니면 여기에 뭔가 빠졌나요?

+0

안전을 위해 내부 프로세스 (일반적으로 어떤 형식의 스레딩), 프로세스 간 (동일한 호스트) 및 프로세스 간 (분산 된, 다른 호스트)에 대해 더 자세히 읽어 보시기 바랍니다. Fyi, boost :: ref는 완전히 다른 문제를 해결하기위한 것으로 스레드로부터 안전하지 않습니다. – aks

답변

2

그들은 단지 입니다. 특징 - 유사점을 강조하는 경우가 있습니다.

예, 스레드는 프로세스보다 가볍습니다.

당신이 잃는 것은 분리입니다 (프로세스는 명시 적으로 노출 된 것을 공유 할 수 있고 올바른 권한 만 부여 할 수 있습니다). 스레드 간 공유에 대한 그러한 제어는 없습니다.

한 스레드가 공유 상태를 망가 뜨리면 모든 스레드가 죽고 공유 메모리도 마찬가지입니다. 그러나 한 스레드가 죽으면 전체 프로세스가 종료되고 별도의 프로세스에서는 발생하지 않습니다.

전혀 다른 점이 있습니다. 프로세스 간 동기화/공유는 더 많은 가중치이지만 더 많은 기능을 가지고 있습니다 (어떻게 다른 호스트에서 별도의 스레드를 실행합니까 :)).