基于协程的高性能网络库 mthread

Apache
C/C++ Python 查看源码»
跨平台
2018-07-31
小小L

mthread

简介

[mthread]是一个基于协程的高性能网络库,目前提供支持TCP/UDP等协议的非阻塞式的客户端库(服务端正在开发中...)

特性

  1. 不用依赖任何第三方库

  2. 基于支持多个平台的协程调度

  3. 支持epoll,kequeue

  4. 不用写异步调度代码,全部代码同步,但是框架内部是异步处理

  5. 提供非阻塞TCP客户端

  6. 提供非阻塞UDP客户端

  7. 优秀的跨平台特性和高性能(理论上只要系统内存足够大,句柄没有限制,可以无限创建无限个协程)

  8. 使用简单,只需要引入一个libmthread.a或者ibmthread.so

除此之外,基于该库之上正在开发各个客户端库:memcache,redis,wrk等

快速开始

编译

编译.a或者.so,到当前目录下执行:

make

编译测试代码,到tests目录下执行:

make

或者只运行某个单元测试:

make event

An dns client

void func(void *args)
{
    std::string *str = (std::string*)args;
    time_t ttl = 0;

    std::vector<int32_t> vc;
    int ret = GetInstance<DNS>()->dns_lookup(str->c_str(), vc, &ttl);
    if (ret < 0) 
    {
        LOG_ERROR("%s, make dns query failed", str->c_str());
        return ;
    }
    for (std::vector<int32_t>::iterator iter = vc.begin(); 
        iter != vc.end(); iter++) 
    {
        struct in_addr addr;
        memcpy(&addr, &(*iter), sizeof(struct in_addr));
        LOG_DEBUG("%s, %d, %s", str->c_str(), *iter, inet_ntoa(addr));
    }
    LOG_DEBUG("ttl : %ld", ttl);
}

int main(int argc, char* argv[])
{
    int ret = mt_init_frame();
    LOG_DEBUG("init ret : %d", ret);
    mt_set_hook_flag();
    mt_set_timeout(200);

    Frame *frame = GetInstance<Frame>();

    // 测试 : 使用协程请求耗时
    LOG_DEBUG("--- start time : %ld", Utils::system_ms());
    for (int i = 2000; i < 2005; i++)
    {
        std::stringstream ss;
        ss << "www." << i << ".com";
        std::string *s = new std::string(ss.str());
        Frame::CreateThread(func, s);
    }
    Frame::Run(true);
    LOG_DEBUG("--- end time : %ld", Utils::system_ms());

    return 0;
}

说明其中dns内部修改调用接口

...

    addr.sin_family = AF_INET;
    if (m_dns_svr_ == NULL)
    {
        addr.sin_addr.s_addr = inet_addr(PUBLIC_DNS_DEFAULT_SERVER);  ///服务器ip
    }
    else
    {
        addr.sin_addr.s_addr = inet_addr(m_dns_svr_);  ///服务器ip
    }
    addr.sin_port = htons((uint16_t)PUBLIC_DNS_DEFAULT_PORT);

    int query_len = make_dns_query_format();
    if (query_len <= 0) 
    {
        return -1;
    }

    int recv_len = sizeof(m_recv_buf_);
    ret = udp_sendrecv(&addr, m_send_buf_, query_len, m_recv_buf_, recv_len, m_timeout_);
    LOG_DEBUG("ret : %d, recv_buf : %s, recv_len : %d", ret, m_recv_buf_, recv_len);

...
的码云指数为
超过 的项目
加载中

评论(2)

kiki1000
kiki1000
支持一下
小小L 软件作者
使用试试

暂无资讯

暂无问答

解决Robotium(Instrumentation)初始化时getActivity阻塞的问题

如果应用没有启动,阻塞了 这种情况getActivity肯定会阻塞的,你需要调用startActivity启动起来: getInstrumentation().getTargetContext().startActivity(intent); 如果在Robotium中还是没...

2018/07/17 13:24
17
0
Qt学习系列4--使用线程

在Qt中正确使用线程的方法

2014/07/30 13:08
131
0
可以自动消失的dialog希望对大家有用

默认的dialog都可以设置确定与取消

2015/09/14 15:09
14
0
ANR异常产生的原因及其解决办法

ANR应用程序无响应

2015/09/30 20:09
344
0
子线程+Handler简单实现

package com.example.testthreadhandler; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.util.Log; impo...

2014/07/11 15:40
5
0
Android4.4DialogUI线程CalledFromWrongThreadExcection

最近碰到一件奇怪的事情,原来在android4.2下面跑完全没有问题的代码在4.4下面会出现如下异常: 01-17 13:06:25.087: E/AndroidRuntime(12673): android.view.ViewRootImpl$CalledFromWrong...

2014/01/23 22:05
1K
0
Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面

本博文转载地址:http://blog.csdn.net/mylzc/article/details/6736988 Android异步处理系列文章索引 Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面 Android异步处理二:使用...

2016/08/01 21:27
5
0
HierarchyViewer

https://github.com/romainguy/ViewServer

2016/08/04 17:56
10
0
android线程总结

private Handler mHandler = new Handler() { public void handleMessage (Message msg) {//此方法在ui线程运行 switch(msg.what) { } }; Thread mThread = new Thread(runnable); mThread.s...

2013/01/16 01:57
20
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部