2010-03-26 5 views
1

시스템에서 boost :: thread를 테스트하고 있습니다. 한 스레드가 다른 변수를 수정하거나 심지어 클래스의 멤버 변수를 수정하기 때문에 fork()로 작동해야합니다.Boost :: Thread or fork() : 다중 스레드 HTTP 프록시

나는 fork()를 사용하여 프로젝트를 수행합니까? 아니면 boost :: thread를 사용하는 몇 가지 대안이 있습니까?

기본적으로이 프로그램은 Linux와 FreeBSD에서 실행됩니다.

HTTP 프록시 인 주 스레드에서 accept()를 사용하고 서비스를 만드는 보조 스레드에 클래스 (파일 설명자 소켓이있는 경우)를 허용하는 함수입니다.

프록시를 구현하는 더 좋은 방법이 있습니까?

+0

'fork()'로 무엇을 의미합니까? – pajton

+0

@pajton 스레드의 변수는 다른 스레드에 의해 수정되지 않습니다. – osmano807

답변

4

fork()은 독립적 인 메모리 영역을 갖는 프로세스을 생성합니다. IPC를 통해 중재해야합니다.

boost::thread 메모리를 공유 할 수있는 스레드을 만듭니다.

이들은 서로 비교할 수 없습니다.


스레드 로컬 저장소를 만들려면 boost::thread_specific_ptr을 사용하십시오.

http://www.boost.org/doc/libs/1_42_0/doc/html/thread/thread_local_storage.html을 참조하십시오.

는 (당신은 또한 아키텍처를 지원할 수있는 컴파일러 경우,이 스레드 로컬 할 __thread int xyz;으로 전역 변수를 꾸밀 수 있습니다.)

+0

pthread에 속하지 않기 위해 boost :: thread를 사용하고 있습니다. _ *() – osmano807

+0

@ osmano807 : 스레드 로컬 변수 * (각 스레드마다 고유 한)를 만들겠습니까? – kennytm

+0

@KennyTM : 네, 기본적으로 그렇습니다. 수정되는 클래스의 변수가 있는데, 이것이 해결책이라고 생각합니다. – osmano807

2

그것은 소리를 여러 스레드가 글로벌 변경 할 수 있도록 노력하고있다처럼 다른 스레드가없는 변수는 다른 스레드에 영향을줍니다. 분기 처리를 통해 응용 프로그램의 전체 메모리 공간이 기본적으로 복사되고 분기의 각 분기마다 자체 변수가 있으며 IPC를 통하는 경우를 제외하고는 두 분기가 통신 할 수 없습니다.

boost :: thread를 사용하려면 동일한 메모리 공간이 모든 스레드에서 공통적이기 때문에 스레드가 서로 영향을 미치지 않게하려면이 작업을 직접 수행해야합니다. 각 스레드 함수에 대해 로컬 변수를 만들 수 있습니다.

포크 대신 스레드를 사용하면 특히 스레드가 데이터를 공유하게하려는 경우 더욱 유연 해집니다. 모든 스레드가 변경할 수있는 변수를 원할 경우 한 스레드 만 변수를 한 번에 변경할 수 있도록 변경할 때 뮤텍스 잠금으로 보호해야합니다.