c++实现多线程服务器

子线程执行的函数和主线程执行的顺序没有先后关系,一般主线程靠前。

#include 
#include 
#include 
#include 
#include 
using namespace std;
struct node{
    pthread_mutex_t mutex;
    int tot;
};
node test;
void *print(void *arg)
{
    printf("thread id = %ul\n", *(unsigned int *)arg);
    printf("in print()\n");
    test.tot++;
    printf("tot = %d\n", test.tot);
    while(1);
}

void create()
{
   printf("============create start=========\n");
   pthread_t thread[8];
   pthread_t *ptr=NULL;
   for(int i=0;i<8;++i){
       ptr=&thread[i];
       if(pthread_create(&thread[i], NULL, print, (void *)ptr)!=0)
       {
          printf("errno = %d : %s", errno, strerror(errno));
          return ;
       }
       pthread_detach(thread[i]);
   }
   printf("============create end=========\n");
}

int main()
{
   printf("======in main=======\n");
   test.tot=0;
   create();
   printf("========end=========\n");
   while(1);
   return 0;
}

server代码:

1.在主线程起4个线程 每个线程起一个dispatch 由内核调度 线程自己抢占。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 9090
#define BUF_SIZE 1024

struct sock_ev_write{//用户写事件完成后的销毁,在on_write()中执行
    struct event* write_ev;
    char* buffer;
};
struct sock_ev {//用于读事件终止(socket断开)后的销毁
    struct event_base* base;//因为socket断掉后,读事件的loop要终止,所以要有base指针
    struct event* read_ev;
};

/**
 * 销毁写事件用到的结构体
 */
void destroy_sock_ev_write(struct sock_ev_write* sock_ev_write_struct){
    if(NULL != sock_ev_write_struct){
//        event_del(sock_ev_write_struct->write_ev);//因为写事件没用EV_PERSIST,故不用event_del
        if(NULL != sock_ev_write_struct->write_ev){
            free(sock_ev_write_struct->write_ev);
        }
        if(NULL != sock_ev_write_struct->buffer){
            delete[]sock_ev_write_struct->buffer;
        }
        free(sock_ev_write_struct);
    }
}


/**
 * 读事件结束后,用于销毁相应的资源
 */
void destroy_sock_ev(struct sock_ev* sock_ev_struct){
    if(NULL == sock_ev_struct){
        return;
    }
    event_del(sock_ev_struct->read_ev);
    event_base_loopexit(sock_ev_struct->base, NULL);//停止loop循环
    if(NULL != sock_ev_struct->read_ev){
        free(sock_ev_struct->read_ev);
    }
    event_base_free(sock_ev_struct->base);
//    destroy_sock_ev_write(sock_ev_struct->sock_ev_write_struct);
    free(sock_ev_struct);
}
int getSocket(){
    int fd =socket( AF_INET, SOCK_STREAM, 0 );
    if(-1 == fd){
        cout<<"Error, fd is -1"<buffer);
//    int write_num0 = write(sock, sock_ev_write_struct->buffer, strlen(sock_ev_write_struct->buffer));
//    int write_num = write(sock, sock_ev_write_struct->buffer, strlen(sock_ev_write_struct->buffer));
    int write_num = write(sock, buffer, strlen(buffer));
    destroy_sock_ev_write(sock_ev_write_struct);
    cout<<"on_write() finished, sock="<buffer = buffer;
    struct event* write_ev = (struct event*)malloc(sizeof(struct event));//发生写事件(也就是只要socket缓冲区可写)时,就将反馈数据通过socket写回客户端
    sock_ev_write_struct->write_ev = write_ev;
    event_set(write_ev, sock, EV_WRITE, on_write, sock_ev_write_struct);
    event_base_set(event_struct->base, write_ev);
    event_add(write_ev, NULL);
    cout<<"on_read() finished, sock="<

client代码: 参考了一下网上的博主写的  主要是server的修改

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

#define BUF_SIZE 1024

/**
 * 连接到server端,如果成功,返回fd,如果失败返回-1
 */
int connectServer(char* ip, int port){
    int fd = socket( AF_INET, SOCK_STREAM, 0 );
    cout<<"fd= "<> ip;
    cout << "Please input port:"<> port;
    cout << "ServerIP is "<> buffer;
        if(strcmp("q", buffer)==0 || strcmp("quit", buffer)==0){
            isBreak=true;
            close(socket_fd);
            break;
        }
        cout << "Your input is "<

 

你可能感兴趣的:(多线程,libevent)