基于多线程的EventSelect

单线程的: 异步io通知 WSAEventSelect

单线程上最多只能接受64个event;

改版多线程的 , 大概思路:

1. 主线程就接受一个监听套接字, accept返回的socket 仍到全局队列中

2. 一个分配socket的线程 用于控制 socket 分配到哪个 监听事件的线程中去 [ dispath thread] ;

3. 创建一个线程池 默认4个线程, 每个线程分别监听  WSA_MAXIMUM_WAIT_EVENTS - 1 个事件, 第一个事件用于分派线程通知

有新的socket 来了 ; 这样 4个线程总共可监听 (WSA_MAXIMUM_WAIT_EVENTS - 1 ) * 4 个socket;

代码有点乱, 也没测试过; 纯粹一种思路

用了大量的线程同步,其实不太好 , 可优化很多地方;

#include <iostream>
#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h>
#include <process.h>
#include <deque>
#include <vector>
#include <unordered_map>
#pragma comment(lib, "ws2_32.lib")
#define PORT 9988
using namespace std;


//socket对象
typedef struct _SOCK_OBJ
{
    enum {BUFFSIZE = 4096};
    SOCKET sock;
    char *buf;
    _SOCK_OBJ(SOCKET s):sock(s), buf(new char[BUFFSIZE]) {}
    ~_SOCK_OBJ(){
        if(sock != INVALID_SOCKET)
            closesocket(sock);
        if(buf){
            delete [] buf;
        }
    }
}SOCK_OBJ,*PSOCK_OBJ;


//每个线程一个
typedef struct _THREAD_INFO{
    WSAEVENT * event_arr; //所有的事件都在这
    HANDLE thread_handle; //线程handler
    vector<SOCK_OBJ*> sock_obj_arr; //socket对象
    char nCount; // 当前数量
    SRWLOCK lock; //读写锁

    _THREAD_INFO():nCount(0),event_arr(0){
       sock_obj_arr.reserve(WSA_MAXIMUM_WAIT_EVENTS/2);
       event_arr = new WSAEVENT[WSA_MAXIMUM_WAIT_EVENTS];
       event_arr[0] = WSACreateEvent();
       InitializeSRWLock(&lock);
    }

    //没用到 
    int get_sock_count() {
        int i = 0;
        AcquireSRWLockShared(&lock);
        i  = nCount;
        ReleaseSRWLockShared(&lock);
        return i;
    }
// 触发一次添加操作, 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值