【C++】开源:事件驱动网络库libevent配置使用

😏*★,°* :.☆( ̄▽ ̄)/$:.°★ 😏

这篇文章主要介绍事件驱动库libevent配置使用。
无专精则不能成,无涉猎则不能通。------梁启超

欢迎来到我的博客,一起学习,共同进步。

喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • [:smirk:1. 项目介绍](#:smirk:1. 项目介绍)
    • [:blush:2. 环境配置](#:blush:2. 环境配置)
    • [:satisfied:3. 使用说明](#:satisfied:3. 使用说明)

😏1. 项目介绍

项目Github地址:https://github.com/libevent/libevent

官网:https://libevent.org/

libevent是一个开源的事件通知库,它提供了一个跨平台的接口,用于处理事件驱动的编程。它允许开发人员编写高性能、可扩展的网络应用程序和服务器,而无需关注底层的网络细节。

以下是libevent库的一些主要特点和功能:

1.事件驱动:libevent使用事件驱动的方式处理网络和I/O操作。它基于回调机制,可以处理各种事件,包括网络连接、读写操作、定时器等。
2.跨平台支持:libevent可以在多个平台上运行,包括Linux、Unix、Windows等。它封装了不同操作系统的底层API,使开发人员能够在不同平台上实现相同的功能。
3.高性能:libevent被设计成高效的事件通知引擎,它使用了高效的I/O多路复用技术(如epoll、kqueue等),能够同时处理大量的并发连接和事件。
4.可扩展性:libevent提供了可扩展的接口和机制,开发人员可以自定义事件的处理方式,并添加自定义的事件类型。它还支持多线程和多进程编程模型,方便实现并发处理。
5.支持多种协议:libevent支持多种网络协议,包括TCP、UDP、SSL等。它提供了相应的API和功能,以便开发人员轻松地构建各种网络应用程序。
6.容易使用:libevent具有简洁的API和良好的文档,易于学习和使用。它提供了丰富的示例代码和教程,帮助开发人员快速上手。

总的来说,libevent是一个强大、灵活且高效的事件通知库,广泛用于开发网络应用程序、服务器和高性能系统。

😊2. 环境配置

下面进行环境配置:

bash 复制代码
# apt安装
sudo apt install libevent-dev
# 查看版本(ubuntu默认2.1.8-stable)
pkg-config --modversion libevent
bash 复制代码
# 源码安装
tar -zxvf libevent-2.0.22-stable.tar.gz
cd libevent-2.0.22-stable/
./configure
make
sudo make install

😆3. 使用说明

下面进行使用分析:

最简示例:

cpp 复制代码
#include <event2/event.h>
#include <iostream>

void eventCallback(evutil_socket_t fd, short events, void* arg) {
    std::cout << "Event occurred on socket: " << fd << std::endl;
}

int main() {
    // 创建一个event_base对象,用于管理事件循环
    event_base* base = event_base_new();
    if (!base) {
        std::cerr << "Failed to create event base." << std::endl;
        return 1;
    }

    // 创建一个事件
    event* ev = event_new(base, -1, EV_PERSIST, eventCallback, nullptr);
    if (!ev) {
        std::cerr << "Failed to create event." << std::endl;
        event_base_free(base);
        return 1;
    }

    // 添加事件到事件循环
    timeval delay = { 2, 0 }; // 设定事件触发延迟时间为2秒
    event_add(ev, &delay);

    // 启动事件循环
    if (event_base_dispatch(base) == -1) {
        std::cerr << "Failed to dispatch event base." << std::endl;
        event_free(ev);
        event_base_free(base);
        return 1;
    }

    // 清理资源
    event_free(ev);
    event_base_free(base);

    return 0;
}

编译运行:

bash 复制代码
g++ -o main main.cpp -levent
./main

基于libevent的线程池示例:

cpp 复制代码
#include <event2/event.h>
#include <event2/thread.h>
#include <iostream>
#include <vector>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <thread>

// 任务结构体
struct Task {
    std::function<void()> function;

    Task(const std::function<void()>& f) : function(f) {}
};

// 线程池类
class ThreadPool {
public:
    ThreadPool(int numThreads) : stop(false) {
        // 初始化libevent线程支持
        evthread_use_pthreads();

        for (int i = 0; i < numThreads; ++i) {
            threads.emplace_back([this] {
                event_base* base = event_base_new();
                if (!base) {
                    std::cerr << "Failed to create event base." << std::endl;
                    return;
                }

                // 创建事件来触发任务执行
                event* ev = event_new(base, -1, EV_PERSIST, [](evutil_socket_t fd, short events, void* arg) {
                    ThreadPool* threadPool = static_cast<ThreadPool*>(arg);
                    threadPool->executeTask();
                }, this);

                timeval delay = { 0, 1000 }; // 每隔1毫秒触发一次事件
                event_add(ev, &delay);

                // 执行事件循环
                event_base_dispatch(base);

                event_free(ev);
                event_base_free(base);
            });
        }
    }

    ~ThreadPool() {
        {
            std::unique_lock<std::mutex> lock(taskMutex);
            stop = true;
        }

        taskCondition.notify_all();

        for (auto& thread : threads) {
            thread.join();
        }
    }

    template<class F>
    void enqueue(F&& f) {
        {
            std::unique_lock<std::mutex> lock(taskMutex);
            tasks.emplace(new Task(std::forward<F>(f)));
        }

        taskCondition.notify_one();
    }

private:
    std::vector<std::thread> threads;
    std::queue<Task*> tasks;

    std::mutex taskMutex;
    std::condition_variable taskCondition;

    bool stop;

    void executeTask() {
        Task* task = nullptr;

        {
            std::unique_lock<std::mutex> lock(taskMutex);

            if (tasks.empty()) {
                return;
            }

            task = tasks.front();
            tasks.pop();
        }

        task->function();

        delete task;
    }
};

// 示例使用
void taskFunction(int id) {
    std::cout << "Task " << id << " is being executed." << std::endl;
}

int main() {
    const int numThreads = 4;
    ThreadPool threadPool(numThreads);
    std::cout << "Create " << numThreads << " pools..." << std::endl;

    // 提交任务到线程池
    for (int i = 0; i < 10; ++i) {
        threadPool.enqueue([i] {
            taskFunction(i);
        });
    }

    // 等待所有任务完成
    std::this_thread::sleep_for(std::chrono::seconds(3));
    std::cout << "Task end!!!" << std::endl;

    return 0;
}

编译运行:

bash 复制代码
g++ -o main main.cpp -levent -lpthread -levent_pthreads

以上。

相关推荐
想成为高手49916 分钟前
深入理解二叉搜索树(BST)
数据结构·c++·算法
闻缺陷则喜何志丹1 小时前
【C++数论 因数分解】829. 连续整数求和|1694
c++·数学·算法·力扣··因数分解·组数
珹洺1 小时前
从 HTML 到 CSS:开启网页样式之旅(三)—— CSS 三大特性与 CSS 常用属性
前端·javascript·css·网络·html·tensorflow·html5
zhangpz_1 小时前
c ++零基础可视化——字符串
数据结构·c++·算法
迷迭所归处2 小时前
C++ —— 以真我之名 如飞花般绚丽 - 智能指针
开发语言·c++
很楠不爱2 小时前
Linux网络——NAT/代理服务器
linux·网络·智能路由器
dvlinker2 小时前
内存不足引发C++程序闪退崩溃问题的分析与总结
c++·内存泄漏·内存不足·malloc返回null·new抛出异常·abort强制终止进程·排查c++软件异常常用方法
沥川同学2 小时前
跨平台应用开发框架(1)----Qt(组件篇)
c++·qt·udp·线程·tcp·qt5·qt6.3
南宫乘风2 小时前
深入浅出 WebSocket:构建实时数据大屏的高级实践
网络·websocket·网络协议
万岳科技系统开发7 小时前
外卖系统开发实战:从架构设计到代码实现
android·小程序·开源