2010-02-10 4 views
1

Basicly에 대한 혼란이 내가 가진 무엇 :C++는 스레드

Server:: 
Server (int port) { 
    cout << "Initializing server.\n"; 

    (...)  

    pthread_t newthread; 
    pthread_create(&newthread, NULL, &Server::_startListening, NULL); 

    cout << "Exit\n"; 
    pthread_exit(NULL); // <-- Question 
} 

void* Server::_startListening (void* param) { 
cout << "Start listening for clients ...\n"; 
return 0; 
} 

질문 : 내가 (NULL을)는 pthread_exit을 넣어하지 않는 경우; 코드에서 Linux (Ubuntu)에서 컴파일 할 때 작동하지만 Mac OSX 10.6.2에서는 작동하지 않습니다. 컴파일하고 리눅스에서 실행할 때 서버 초기화, 클라이언트 청취 시작, Mac OSX 종료 중 서버 초기화, 종료, 클라이언트 청취 시작이 표시됩니다.

문제는 poutread_exit 주변에서 발생하는 것으로 보입니다. 만약 내가 그것을 위의 위치에두면 < < Exit. 그 메시지는 결코 표시되지 않을 것입니다 (얼마나 이상한가).

내가 잘못 했나요?

+0

'pthread_exit (NULL);'무엇을 할 것으로 기대합니까? –

+0

그러나 pthread_exit 또는 pthread_join이 주어지지 않은 경우 Mac OS가 스레드를 무시하는 이유는 무엇입니까? – Mark

답변

7

아마도 종료하는 대신 pthread_join을 사용하려고 할 것입니다.

3

문제는 poutread_exit 주위에서 발생하는 것으로 보입니다. 만약 내가 그것을 외측에 놓으면 < < 출구. 그 메시지는 결코 표시되지 않을 것입니다 (얼마나 이상한가).

전혀 이상하지 않습니다. pthread_exit를 호출하면 현재 스레드가 실행을 멈 춥니 다. 그 스레드에서만 "종료"를 표시하려고하므로 일단 스레드가 사라지면 인쇄 할 내용이 남아 있지 않습니다.

"종료"및 "듣기 시작"의 인쇄 순서가 다릅니다. 그것들 각각은 별도의 실에 의해 인쇄됩니다. 동기화가 없으므로 둘 중 먼저 인쇄 할 수 있습니다.

0

스레딩 (스케줄링 등)은 OS에 따라 다릅니다. 리눅스에서와 같이 보입니다. OS는 주 스레드에서 계속 진행하기 전에 새로운 스레드로 컨텍스트를 전환합니다. Mac OS에서는 컨텍스트를 전환하기 전에 현재 스레드를 계속 실행합니다. 이것은 OS에 의존하기 때문에 어떤 종류의 동기화를 수행하지 않으면 두 스레드 중 어느 라인이 먼저 실행되는지 테스트 할 수있는 '리눅스가 상황을 전환합니다'결과를 신뢰할 수 없다는 확실한 방법이 없습니다.

pthread_exit는 위에서 언급 한 것처럼 활성 스레드 (예 : main())를 종료하고 다른 스레드 (_startListning)는 종료하지 않습니다. 현재 스레드를 종료하지 않고 다른 스레드에 조인 (pthread_join)하려고합니다.

1

출력 순서가 결정되지 않았습니다. 이것이 동시성의 의미입니다! 다른 두 가지 대답은 맞습니다 : pthread_exit 출력이 주 스레드를 죽이고 주 종료가 발생하기 전에 참여하려고합니다.

0

pthread_exit은 중단하려는 스레드에서 호출해야합니다. main() 스레드에서 호출하면 주 스레드가 종료되고 프로그램은 수신기 스레드가 종료 될 때까지 실행됩니다.

pthread_exitpthread_join의 맨 페이지를 읽는 것이 좋습니다.

0

위 질문에 대한 답변은 이미 위와 같았지 만, Windows에 가면 더 쉽게 플랫폼 간 호환이 가능하고 멋진 객체 지향 인터페이스를 제공하는 Boost 스레드 라이브러리를 살펴볼 수도 있습니다.