2012-02-13 4 views
5

현재 message_queue 및 shared_memory 양식 향상을 사용하여 통신하는 2 개의 프로세스가 있습니다. 모든 것은 출석으로 진행됩니다.boost :: interprocess threadsafe입니까?

이제이 프로세스 중 하나를 다중 스레드 (다시 부스트 덕분에)로 만들 필요가 있습니다. 스레드 (예 : 뮤텍스)간에 보호 메커니즘을 사용해야하는지 또는 boost :: interprocess 라이브러리 이미 보호 메커니즘을 제공합니까?

부스트 문서에서 해당 정보를 찾지 못했습니다. 그건 그렇고 부스트 1.40을 사용하고 있습니다.

미리 감사드립니다.

+0

http://www.boost.org/doc/libs/1_40_0/doc/html/interprocess/synchronization_mechanisms.html을 읽으셨습니까? –

답변

1

공유 리소스를 잠글 수 있도록해야합니다.

부스트 문서에서 예제를 찾을 수 있습니다. 예를 들어 : 부스트 :: 간 (공유 메모리 등)에서

http://www.boost.org/doc/libs/1_40_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.mutexes.mutexes_scoped_lock

+0

그렇다면 제대로 이해한다면 보호 메커니즘이 구현되어 있지 않습니다. 명시 적으로 메모리와 대기열을 보호해야합니다. – Tom97531

2

공유 자원이 필요한 동기화를 제공해야합니다. 그 이유는 동기화가 필요하지 않을 수 있으며 일반적으로 다소 비싼 작업 성능입니다.

예를 들어 공유 메모리에 32 비트 정수 형식의 현재 통계와 이러한 값을 읽는 몇 가지 프로세스를 작성하는 프로세스가 있다고 가정 해보십시오. 값은 정수이므로 (플랫폼에 따라서는 읽기와 쓰기가 원 자성이므로) 하나의 프로세스에서 이들을 작성하고 몇 개의 프로세스에서이를 읽으므로이 설계에는 동기화가 필요하지 않습니다.

그러나 위 예제에 여러 작성자가 있거나 또는 정수 대신 문자열 데이터를 사용하는 경우와 같이 일부 예에서는 동기화가 필요합니다. 이 다양한 내부 부스트의 동기화 메커니즘이다 (물론 비 부스트 것들,하지만 이미 사용 부스트 때문에), 여기에 설명 : http://www.boost.org/doc/libs/1_48_0/doc/html/interprocess/synchronization_mechanisms.html

[정보 부스트 :

[1.48 안정 버전에 대한 정보를 부스트] 버전에 대한 귀하의 사용 : 공유 메모리와 1.40] http://www.boost.org/doc/libs/1_40_0/doc/html/interprocess/synchronization_mechanisms.html

을 익명으로 할 수있는 공유 메모리 세그먼트의 기지에서 동기화 메커니즘을 배치하는 일반적인 방법입니다 (OS 커널이에 대한 액세스를 제공하지 않습니다 의미 그것은 이름으로). 이 방법은 모든 프로세스가 공유 메모리 세그먼트를 잠그는 방법을 알고 있고, 세그먼트와 잠금을 연결할 수 있습니다 (예를 들어 여러 개가있는 경우)

뮤텍스에는 프로세스 내에서 동일한 실행 스레드가 필요합니다. 그것을 잠근다. 서로 다른 실행 스레드에서 동기화 객체를 잠그고 잠금 해제해야하는 경우 세마포가 필요합니다.

뮤텍스를 프로세스 간 뮤텍스 (http://www.boost.org/doc/libs/1_48_0/doc/html/boost/interprocess/interprocess_mutex.html)로 사용하도록 선택하는 경우, 부스트 스레드 라이브러리의 뮤텍스는 여러 스레드가있는 단일 프로세스 용입니다.

+0

+1 "값이 정수이기 때문에 (따라서 플랫폼에 따라 읽기와 쓰기는 원 자성입니다.) 하나의 프로세스에서 이들을 작성하고 몇 개의 프로세스에서이를 읽으므로이 설계에는 동기화가 필요하지 않습니다." – FaceBro

관련 문제