sevencat 发表于 2015-11-21 22:28:41

libuv的一些尝试代码,感觉还可以。

#pragma once

typedef boost::function<void()> VoidFunc;
class FuncArray
{
public:
    FuncArray(void)
    {
      funcvec.reserve(4096);
    }

    void post(VoidFunc func)
    {
      asio::detail::mutex::scoped_lock lock(mtx);
      funcvec.push_back(func);
    }

    void handle()
    {
      std::vector<VoidFunc> curfuncvec;
      {
            asio::detail::mutex::scoped_lock lock(mtx);
            curfuncvec.swap(funcvec);
      }
      for(size_t i=0;i<curfuncvec.size();i++)
      {
            curfuncvec();
      }
    }

    ~FuncArray(void){}
    std::vector<VoidFunc> funcvec;
    asio::detail::mutex mtx;
};

#pragma once
#include "funcarray.h"

class UvLoopWorker
{
public:
    UvLoopWorker(void);
    virtual ~UvLoopWorker(void);

    //启动线程
    int start()
    {
      new asio::thread(boost::bind(&UvLoopWorker::run,this));
      return 0;
    }
   
    //在他的线程里面执行一个函数
    void post(VoidFunc func)
    {
      _fa.post(func);
      notify();
    }

    virtual void on_start_loop(){}
   
protected:

    void notify()
    {
      int r = uv_async_send(&_async);
    }

    int run();

    static void async_cb(uv_async_t* handle)
    {
      UvLoopWorker *pthis=(UvLoopWorker *)handle->data;
      pthis->_fa.handle();
    }
    uv_async_t _async;
    uv_loop_t *_loop;
    FuncArray _fa;
};

class UvLoopWorkerMgr
{
public:
    static void init(int numofitems);
    static std::vector<UvLoopWorker *> wrkers;

    void post(VoidFunc &func)
    {
      static int id=0;
      id++;
      post(func,id);
    }

    void post(VoidFunc &func,int idx)
    {
      int nitem=idx % wrkers.size();
      return wrkers->post(func);
    }
};

winston 发表于 2015-11-21 22:32:19

有时间要研究研究这个东西,看你很推崇。

sevencat 发表于 2015-11-22 20:11:33

如果不用c++开发网络程序,就不需要。

freeeyes 发表于 2015-12-31 08:44:01

有点类似工作线程池,对对象数据取摸调用?

sevencat 发表于 2015-12-31 20:47:46

是的,工作线程池,跟asio::io_service差不多,但是asio::io_service你每投递一个,他会投递一个请求,这个你如果同时投递几千个,他也只激活一次,
页: [1]
查看完整版本: libuv的一些尝试代码,感觉还可以。