libuv封装共享信号量

#ifndef __CUVSEM__H_
#define __CUVSEM__H_
#include "uv.h"
class CUvSem{
public:
    CUvSem();
    ~CUvSem();

public:
    void Post();
    void Wait();
    int TryWait();

private:
    uv_sem_t mstUvSem;
};

#endif



#include "UvSem.h"

CUvSem::CUvSem(){
    uv_sem_init(&mstUvSem, 0);
}

CUvSem::~CUvSem(){
    uv_sem_destroy(&mstUvSem);
}

void CUvSem::Post() {
    uv_sem_post(&mstUvSem);
}

void CUvSem::Wait() {
    uv_sem_wait(&mstUvSem);
}

int CUvSem::TryWait() {
    return uv_sem_trywait(&mstUvSem);
}

 

<think> 我们正在详细讨论libuv中的核心类型。根据用户要求,需要详细介绍以下类型:uv_loop_t, uv_thread_t, uv_async_t, uv_sem_t, uv_mutex_t, uv_connect_t, uv_udp_t, uv_tcp_t。 首先,我们根据之前的知识和引用内容,结合libuv文档,逐个分析这些类型。注意引用内容主要涉及事件循环和异步操作机制,我们可以参考这些内部机制来解释类型的作用。 1. uv_loop_t: 事件循环的核心结构,负责处理I/O事件、定时器、异步任务等。 2. uv_thread_t: 表示线程的句柄。 3. uv_async_t: 用于线程间通信的异步句柄。 4. uv_sem_t: 信号量,用于线程同步。 5. uv_mutex_t: 互斥锁,用于线程同步。 6. uv_connect_t: 表示连接请求(如TCP连接)。 7. uv_udp_t: UDP句柄,用于UDP通信。 8. uv_tcp_t: TCP句柄,用于TCP通信。 下面我们逐一详细介绍。 </think> ### Libuv 核心类型详解 #### 1. `uv_loop_t` - 事件循环核心结构 **功能**: 管理所有 I/O 操作、定时器和回调的中央调度器(事件驱动模型的核心)[^1][^2]。 **关键组件**: ```c typedef struct uv_loop_s { uv_handle_t* handle_queue; // 活跃句柄链表 uv__io_t** watchers; // I/O观察者数组 uv_mutex_t wq_mutex; // 工作队列互斥锁[^1] uv_async_t wq_async; // 线程通信异步句柄[^2] QUEUE wq; // 工作队列 // ...其他计时器/信号/文件描述符管理字段 } uv_loop_t; ``` **工作流程**: 1. 初始化:`uv_loop_init()` 2. 运行循环:`uv_run(loop, UV_RUN_DEFAULT)` 3. 轮询阶段:通过底层 `epoll/kqueue` 检测 I/O 事件 4. 回调执行:调用注册的回调函数(如 `uv__work_done`[^2]) --- #### 2. `uv_thread_t` - 线程句柄 **功能**: 封装操作系统原生线程(POSIX `pthread_t` / Windows `HANDLE`)。 **典型操作**: ```c uv_thread_t thread_id; uv_thread_create(&thread_id, worker_function, data); uv_thread_join(&thread_id); // 等待线程结束 ``` --- #### 3. `uv_async_t` - 线程间通信句柄 **功能**: 实现事件循环线程与工作线程的异步通信,通过 `eventfd` 或管道触发[^3]。 **工作原理**: 1. 工作线程:`uv_async_send()` 触发写操作(写入 `loop->async_wfd`[^3]) 2. 主线程:I/O 回调 `uv__async_io` 检测到读事件 3. 执行回调:调用 `uv__work_done` 处理任务完成事件[^2] ```mermaid graph LR Worker[工作线程] -->|uv_async_send| Pipe[管道写入] Pipe -->|事件触发| Loop[事件循环] Loop -->|uv__async_io| Callback[uv__work_done] ``` --- #### 4. `uv_sem_t` - 信号量 **功能**: 控制多线程对共享资源的访问(基于 POSIX 信号量)。 **操作接口**: ```c uv_sem_t sem; uv_sem_init(&sem, 0); // 初始值=0(阻塞状态) uv_sem_wait(&sem); // 等待信号量(P操作) uv_sem_post(&sem); // 释放信号量(V操作) uv_sem_destroy(&sem); // 销毁 ``` --- #### 5. `uv_mutex_t` - 互斥锁 **功能**: 保护临界区资源,防止竞态条件(如工作队列访问[^1])。 **典型使用**: ```c uv_mutex_t lock; uv_mutex_init(&lock); uv_mutex_lock(&lock); // 加锁 // 访问共享资源(如修改loop->wq) uv_mutex_unlock(&lock); // 解锁 ``` --- #### 6. `uv_connect_t` - 连接请求 **功能**: 管理 TCP 或 Pipe 的异步连接操作(继承自 `uv_req_t`)。 **生命周期**: 1. 初始化:`uv_tcp_connect(req, handle, addr, callback)` 2. 回调触发:连接完成后调用注册的 `uv_connect_cb` 3. 释放:需手动 `free()`(非托管资源) --- #### 7. `uv_udp_t` - UDP 句柄 **功能**: 实现无连接数据报传输,支持组播和广播。 **关键操作**: ```c uv_udp_t udp; uv_udp_init(loop, &udp); uv_udp_bind(&udp, addr, flags); uv_udp_recv_start(&udp, alloc_cb, recv_cb); // 启动接收 uv_udp_send(&udp, &send_req, buffers, ...); // 异步发送 ``` --- #### 8. `uv_tcp_t` - TCP 句柄 **功能**: 面向连接的流式传输句柄(继承自 `uv_stream_t`)。 **工作模式**: ```c // 服务器端 uv_tcp_t server; uv_tcp_bind(&server, addr); uv_listen((uv_stream_t*)&server, backlog, connection_cb); // 客户端 uv_connect_t connect_req; uv_tcp_connect(&connect_req, &client, addr, connect_cb); ``` --- ### 类型协作关系图 ```mermaid graph TD Loop[uv_loop_t] -->|管理| Async[uv_async_t] Loop -->|调度| TCP[uv_tcp_t] Loop -->|调度| UDP[uv_udp_t] Thread[uv_thread_t] -->|提交任务| Loop Thread -->|同步| Mutex[uv_mutex_t] Thread -->|同步| Sem[uv_sem_t] TCP -->|使用| Connect[uv_connect_t] Async -->|触发| Loop[执行uv__work_done] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值