threadPool

Environment:Linux

/*
 * thread pool
 * parameters:
		thread function
		thread function parameter
		threadpool depth
 * */
void createThreadPool(void*(*thFtn)(void*),void* arg,int depth){
    
    //initalize all identidy of thread
    long *tids = calloc(sizeof(long),depth);
    //loop to create all threads
    int _i = 0;
    for(;_i<depth;_i++){
        pthread_create(&tids[_i],0,thFtn,arg);
    }   
    
}

Tcp Preallocate Thread:

1> tpt.h

//tcp_preallocate_thread
//tpt.h
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>

2> server.c

#include "tpt.h"

#define BACKLOG 2
#define PORT 8888
#define BUFFERSIZE 1024

void createThreadPool(void*(*)(void*),void* arg,int);
void *thFtn(void *);
int tptServer(char *);
void server_process(int);

//lock ss in every thread
pthread_mutex_t mlock=PTHREAD_MUTEX_INITIALIZER;
//globalize server socket
int ss;

int main(int argc,char **argv){
    
    if(argc==2){
        tptServer(argv[1]);
    }else{
        return 0;
    }
}

/*
 * thread pool
 * parameters:
		thread function
		thread function parameter
		threadpool depth
 * */
void createThreadPool(void*(*thFtn)(void*),void* arg,int depth){
    
    //initalize all identidy of thread
    long *tids = calloc(sizeof(long),depth);
    //loop to create all threads
    int _i = 0;
    for(;_i<depth;_i++){
        pthread_create(&tids[_i],0,thFtn,arg);
    }   
    
}

/*
  * thread function
  *
  */
void *thFtn(void *arg){
	struct sockaddr_in client_addr;
	//connectFd
	int sc;    
	for(;;){
        int addr_len = sizeof(struct sockaddr);
		pthread_mutex_lock(&mlock);
        sc = accept(ss,(struct sockaddr*)&client_addr,&addr_len);
        pthread_mutex_unlock(&mlock);
        if(sc == -1){
            perror("accept");
            exit(EXIT_FAILURE);
        }
		server_process(sc);
		close(sc);
    }
}

/*
    Server process
*/
void server_process(int sc){
    char buffer[BUFFERSIZE];
    for(;;){
        int size = read(sc,buffer,BUFFERSIZE);
        if(size == 0){
            continue;
        }
        /*char *strsep(char **stringp, const char *delim);*/
        char *sp,*token,*endp;
        sp = buffer;
        long result=0;
        while((token=strsep(&sp," "))!=NULL){
            result += strtol(token,&endp,10);
        }
        printf("%i\n",result);
        memset(buffer,0,BUFFERSIZE);
    }
}

int tptServer(char *IP){
    int _i;
    int _err;
	struct sockaddr_in server_addr;
    pid_t pid;
 
    ss = socket(AF_INET,SOCK_STREAM,0);
    if(ss == -1){
        perror("socket");
        exit(EXIT_FAILURE);
    }
    memset(&server_addr,0,sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);
    server_addr.sin_addr.s_addr = inet_addr(IP);
 
    _err = bind(ss,(struct sockaddr*)&server_addr,sizeof(server_addr));
    if(_err == -1){
        perror("bind");
        exit(EXIT_FAILURE);
    }
    _err = listen(ss,BACKLOG);
    if(_err == -1){
        perror("listen");
        exit(EXIT_FAILURE);
    }
 
	//create thread pool
    //depth 20
    createThreadPool(thFtn,NULL,20);
	
    pause();
    return 0;
}

3> client.c

#include "tpt.h"

#define PORT 8888
#define BUFFERSIZE 1024

void client_process(int);
 
int main(int argc,char **argv){
    int ss;
    struct sockaddr_in server_addr;
 
    ss = socket(AF_INET,SOCK_STREAM,0);
    if(ss == -1){
        perror("socket");
        exit(EXIT_FAILURE);
    }
    memset(&server_addr,0,sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);
    server_addr.sin_addr.s_addr = htons(INADDR_ANY);
 
    inet_pton(AF_INET,argv[1],&server_addr.sin_addr);
 
    connect(ss,(struct sockaddr*)&server_addr,sizeof(server_addr));
    client_process(ss);
    close(ss);
    return 0;
}

void client_process(int ss){
    int size = 0;
    char buffer[BUFFERSIZE];
    for(;;){
        size = read(0,buffer,BUFFERSIZE);
        if(!strcmp(buffer,"quit\n")){
            printf("Bye~\n");
            return;
        }
        if(size>0){
            write(ss,buffer,size);
        }
        memset(buffer,0,BUFFERSIZE);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值