2017-12-07 11 views
0

나는 C++로 작성된 채팅 서버를 가지고 있으며 phtreads에 문제가 있습니다. 이 서버는 pthread의 배열을 만들도록 여러 개의 연결을 처리한다고 가정합니다. 새로운 클라이언트가 연결되면 배열로부터이 클라이언트에 하나의 pthread를주고 처리 함수를 호출합니다. 여기서 함수는 구현 된 것입니다. 하지만이 클라이언트 disconect 때 pthread가 끝나고 pthread 배열에 어떤 인덱스가 비어 있는지 찾는 방법을 모른다. 나는이 코드가 끔찍한 것을 알고 있지만이 프로그램을 더 잘 만들고 싶다.실행중인 pthread 배열에서 끝난 pthread에 가입하는 방법

그래서 내 질문은 내가 할 수있는 한 가지 pthread가 끝날 때 그 다음에 잠재 고객을위한 pthread의 배열에 그 색인을 비울 것이다. 그리고 더 많은 사람들이 100 명의 사람들이 내가 어레이를 realloc 연결한다고 말할 수 있을까요?

어떻게 그 pthread에 합류하여 pthread가 끝났으며 어느 인덱스를 다시 사용할 수 있는지 찾는 방법은 무엇입니까?

struct parsing{ 
    int socket; 
}; 

int i = 0; 
int strop = 100; 
pthread_t *thread; 
thread = (pthread_t*)malloc(sizeof(pthread_t)*100); 
struct parsing args; 
while (1) 
{ 
    if((client_sock = accept(socket_desc, (struct sockaddr *)&socket_addr, (socklen_t *)&client_sock_len)) < 0) 
    { 
     fprintf(stderr,"Accept Error"); 
     return 5; 
    } 
    printf("connected %d",client_sock); 
    args.socket = client_sock; 
    pthread_create(&thread[i], NULL, &handle_connection, (void *)&args); 
    i++; 
    if (i == strop) 
    { 
     strop = strop + 100; 
     void * ptr = (pthread_t*)realloc(thread,sizeof(pthread_t)*strop); 
    } 
} 
+0

std :: thread를 사용하십시오. –

답변

0

어떻게 그 pthread와 시청에 다시 사용하는 것이 지금 무료 인덱스 찾는 종료 pthread에있는 찾을 수 있습니까?

pthreads API는 종료 된 스레드를 찾는 방법을 제공하지 않습니다. Glibc는 특정 스레드 (non-blocking join)를 시도 할 수있는 이식성이없는 확장 기능을 가지고 있습니다 (pthread_tryjoin_np() 참조). 사용 가능하다면 폴링 기반 솔루션을 구축 할 수 있습니다.

하지만이 작업을 수행 할 수있는 권리 방법을 말하고 싶지만는가 완료되는 메인 스레드에게 에 작업자 스레드에 대한 메커니즘을 구축하는 것입니다. 예를 들어 주 스레드가 볼 수있는 연결된 목록에 자신의 스레드 ID를 추가 한 다음 신호를 보내거나 pthread_cond_signal()을 사용하여 주 스레드의주의를 끌 수 있습니다. 공유 변수에 대한 다중 스레드 액세스에 대해 적절한 동기화를 제공해야합니다.

+0

좋아, 고맙겠습니다 :) – krakra

+0

args 구조체를 여러 개의 pthread에 다시 사용하면 스레드에서 파일 설명자를 즉시 ​​복사하더라도 문제가 발생합니다. 새 스레드가 OS에 의해 예약되기 전에 다른 클라이언트가 항상 연결될 수 있습니다. (존이 말했듯이 : 적절한 동기화가 중요합니다) – Ronald