基于多反应堆的高并发服务器【C/C++/Reactor】(中)子线程 WorkerThread的实现

发布时间:2024年01月03日

一、工作线程

  • 线程ID:每个线程都有一个唯一的ID,用于标识
  • 线程的名字:非必需,主要用于识别线程
  • 互斥锁:线程同步
  • 条件变量:线程阻塞
  • EventLoop:在每个子线程里边都有一个反应堆模型

// 定义子线程对应的结构体
struct WokerThread {
    pthread_t threadID;// 线程ID
    char name[24];// 线程名字
    pthread_mutex_t mutex;// 互斥锁(线程同步)
    pthread_cond_t cond;// 条件变量(线程阻塞)
    struct EventLoop* evLoop;// 事件循环(反应堆模型)
    // 在每个子线程里边都有一个反应堆模型
};

二、工作线程初始化

// 初始化
int workerThreadInit(struct WokerThread* thread, int index);
// 初始化
int workerThreadInit(struct WokerThread* thread, int index) {
    thread->threadID = 0;// 线程ID
    sprintf(thread->name, "SubThread-%d", index);// 线程名字

    // 指定为NULL,表示使用默认属性
    pthread_mutex_init(&thread->mutex, NULL);// 互斥锁
    pthread_cond_init(&thread->cond, NULL);// 条件变量

    thread->evLoop = NULL;// 事件循环(反应堆模型)
    return 0;
}

三、启动线程

// 启动线程
void workerThreadRun(struct WokerThread* thread);
// 子线程的回调函数
void* subThreadRunning(void* arg) {
    struct WokerThread* thread = (struct WokerThread*)arg;
    
    // 还有子线程里边的evLoop是共享资源,需要添加互斥锁
    pthread_mutex_lock(&thread->mutex);// 加锁
    thread->evLoop = eventLoopInitEx(thread->name);
    pthread_mutex_unlock(&thread->mutex);// 解锁

    pthread_cond_signal(&thread->cond);// 发送信号(唤醒主线程,通知主线程解除阻塞)
    eventLoopRun(thread->evLoop);// 启动反应堆模型
    return NULL;
}

// 启动线程
void workerThreadRun(struct WokerThread* thread) {
    // 创建子线程
    pthread_create(&thread->threadID, NULL, subThreadRunning, thread);
    /*
        在这里阻塞主线程的原因是:在于子线程的反应堆模型是否被真正的创建出来了?
        因此,可以判断一下thread->evLoop是否为NULL,如果等于NULL,说明
        子线程反应堆模型还没有被初始化完毕,没有初始化完毕,我们就阻塞主线程
    */
    // 阻塞主线程,让当前函数不会直接结束
    pthread_mutex_lock(&thread->mutex);
    while(thread->evLoop == NULL) { // 多次判断
        pthread_cond_wait(&thread->cond, &thread->mutex);// 子线程的回调函数(subThreadRunning)里调用pthread_cond_signal(&thread->cond)可以解除这里的阻塞
    }
    pthread_mutex_unlock(&thread->mutex);
}

未完待续~

?

文章来源:https://blog.csdn.net/weixin_41987016/article/details/135370005
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。