728x90

쓰레드의 소멸

- 쓰레드에 할당한 함수가 끝났다고 해서 완전히 소멸한 것이 아님

- pthread_join 함수나 pthread_detach 함수를 호출해서 소멸을 시켜줘야 함

- pthread_join은 함수가 끝날 떄 까지 대기하는 함수

- pthread_detach : 종료와 동시에 소멸을 시킴

#include <pthread.h>

int pthread_detach(pthread_t thread);

 

멀티 쓰레드 기반의 다중 접속 서버

void * handle_clnt(void * arg);
void send_msg(char * msg, int len);
void error_handling(char * msg);

int clnt_cnt=0;
int clnt_socks[MAX_CLNT];		// 클라이언트 소켓들
pthread_mutex_t mutx;

int main(int argc, char *argv[])
{
	int serv_sock, clnt_sock;
	struct sockaddr_in serv_adr, clnt_adr;
	int clnt_adr_sz;
	pthread_t t_id;
  
	pthread_mutex_init(&mutx, NULL);		// 뮤텍스 생성
	serv_sock=socket(PF_INET, SOCK_STREAM, 0);		// 서버 소켓 생성

	if(bind(serv_sock, (struct sockaddr*) &serv_adr, sizeof(serv_adr))==-1)
		printf("bind() error");
	if(listen(serv_sock, 5)==-1)
		printf("listen() error");
	
	while(1)
	{
		clnt_adr_sz=sizeof(clnt_adr);
		clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_adr,&clnt_adr_sz);
		
		pthread_mutex_lock(&mutx);		// lock
		clnt_socks[clnt_cnt++]=clnt_sock;
		pthread_mutex_unlock(&mutx);	// unlock
	
		pthread_create(&t_id, NULL, handle_clnt, (void*)&clnt_sock);		// 소켓 정보들을 넘겨줌
		pthread_detach(t_id);		// 쓰레드 종료 시 소멸 시킴
		printf("Connected client IP: %s \n", inet_ntoa(clnt_adr.sin_addr));
	}
	close(serv_sock);
	return 0;
}
	
void * handle_clnt(void * arg)
{
	int clnt_sock=*((int*)arg);
	int str_len=0, i;
	char msg[BUF_SIZE];
	
	while((str_len=read(clnt_sock, msg, sizeof(msg)))!=0)		// 데이터를 읽어서
		send_msg(msg, str_len);		// 모든 클라이언트들에게 send 해줌
	
	pthread_mutex_lock(&mutx);
	for(i=0; i<clnt_cnt; i++)   // remove disconnected client
	{
		if(clnt_sock==clnt_socks[i])
		{
			while(i++<clnt_cnt-1)
				clnt_socks[i]=clnt_socks[i+1];
			break;
		}
	} // 종료 시 소켓 목록에서 삭제
	clnt_cnt--;
	pthread_mutex_unlock(&mutx);
	close(clnt_sock);		// 소멸
	return NULL;
}
void send_msg(char * msg, int len)   // send to all
{
	int i;
	pthread_mutex_lock(&mutx);
	for(i=0; i<clnt_cnt; i++)
		write(clnt_socks[i], msg, len);		// 모든 클라이언트들에게 send 해줌
	pthread_mutex_unlock(&mutx);
}
728x90

+ Recent posts