用c99 写的简单线程池类

2023-11-16

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <stdbool.h>
#include <unistd.h>

// 任务结构体
typedef struct task {
    void (*function)(void *p);
    void *arg;
    struct task *next;
} task_t;

// 线程池结构体
typedef struct thread_pool {
    pthread_mutex_t lock;
    pthread_cond_t cond;
    pthread_t *threads;
    task_t *task_queue;
    bool stop;
    int thread_count;
} thread_pool_t;

// 线程处理函数
void *thread_function(void *arg) {
    thread_pool_t *pool = (thread_pool_t *)arg;
    task_t *task;

    while (1) {
        pthread_mutex_lock(&(pool->lock));

        while (pool->task_queue == NULL && !pool->stop) {
            pthread_cond_wait(&(pool->cond), &(pool->lock));
        }

        if (pool->stop) {
            pthread_mutex_unlock(&(pool->lock));
            pthread_exit(NULL);
        }

        task = pool->task_queue;
        pool->task_queue = task->next;

        pthread_mutex_unlock(&(pool->lock));

        (*(task->function))(task->arg);

        free(task);
    }

    return NULL;
}

// 初始化线程池
int thread_pool_init(thread_pool_t *pool, int thread_count) {
    pool->threads = (pthread_t *)malloc(sizeof(pthread_t) * thread_count);
    if (pool->threads == NULL) {
        perror("malloc");
        return -1;
    }

    pool->task_queue = NULL;
    pool->stop = false;
    pool->thread_count = thread_count;

    pthread_mutex_init(&(pool->lock), NULL);
    pthread_cond_init(&(pool->cond), NULL);

    for (int i = 0; i < thread_count; ++i) {
        pthread_create(&(pool->threads[i]), NULL, thread_function, (void *)pool);
    }

    return 0;
}

// 添加任务到线程池
int thread_pool_add_task(thread_pool_t *pool, void (*function)(void *), void *arg) {
    task_t *new_task = (task_t *)malloc(sizeof(task_t));
    if (new_task == NULL) {
        perror("malloc");
        return -1;
    }

    new_task->function = function;
    new_task->arg = arg;
    new_task->next = NULL;

    pthread_mutex_lock(&(pool->lock));

    task_t *task_iter = pool->task_queue;
    if (task_iter == NULL) {
        pool->task_queue = new_task;
    } else {
        while (task_iter->next != NULL) {
            task_iter = task_iter->next;
        }
        task_iter->next = new_task;
    }

    pthread_cond_signal(&(pool->cond));
    pthread_mutex_unlock(&(pool->lock));

    return 0;
}

// 销毁线程池
void thread_pool_destroy(thread_pool_t *pool) {
    pthread_mutex_lock(&(pool->lock));
    pool->stop = true;
    pthread_mutex_unlock(&(pool->lock));

    pthread_cond_broadcast(&(pool->cond));

    for (int i = 0; i < pool->thread_count; ++i) {
        pthread_join(pool->threads[i], NULL);
    }

    free(pool->threads);

    task_t *task_iter;
    while (pool->task_queue != NULL) {
        task_iter = pool->task_queue;
        pool->task_queue = task_iter->next;
        free(task_iter);
    }

    pthread_mutex_destroy(&(pool->lock));
    pthread_cond_destroy(&(pool->cond));
}
// 示例任务
void sample_task(void *arg) {
    int *num = (int *)arg;
    printf("Thread %ld processing task %d\n", pthread_self(), *num);
    sleep(1);
}

int main() {
    thread_pool_t pool;
    int thread_count = 4;

    thread_pool_init(&pool, thread_count);

    int task_count = 10;
    int task_nums[task_count];
    for (int i = 0; i < task_count; ++i) {
        task_nums[i] = i + 1;
        thread_pool_add_task(&pool, sample_task, (void *)&task_nums[i]);
    }

    sleep(5); // 等待线程池处理任务

    thread_pool_destroy(&pool);

    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用c99 写的简单线程池类 的相关文章

  • WinForms:如何确定窗口是否不再活动(没有子窗口具有焦点)?

    我的应用程序使用多个窗口 我想隐藏一个特定窗口 以防应用程序失去焦点 当活动窗口不是应用程序窗口时 source https stackoverflow com questions 466354 how can i tell if a wi
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • 32 位应用程序的特征最大矩阵大小

    所以 我正在寻找Eigen http eigen tuxfamily org index php title Main Page当我尝试声明大于 10000x10000 的矩阵时 包崩溃 我需要声明一个像这样的矩阵 可靠地大约有 13000
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • 对齐 GridView 中的行值

    我需要在 asp net 3 5 中右对齐 gridview 列中的值 我怎样才能做到这一点
  • POCO HTTPSClientSession 发送请求时遇到问题 - 证书验证失败

    我正在尝试使用 POCO 库编写一个向服务器发出 HTTPS 请求的程序 出于测试目的 我正在连接到具有自签名证书的服务器 并且我希望允许客户端进行连接 为了允许这种情况发生 我尝试安装InvalidCertificateHandler这是
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • 如何从 C# 控制器重定向到外部 url

    我使用 C 控制器作为网络服务 在其中我想将用户重定向到外部网址 我该怎么做 Tried System Web HttpContext Current Response Redirect 但没有成功 使用控制器的重定向 http msdn
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • Azure 事件中心 - 按顺序接收事件

    我使用下面的代码从 Azure Event Hub 接收事件 https learn microsoft com en us azure event hubs event hubs dotnet framework getstarted s
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

    我提到了一些类似的问题 但没有一个涉及IO 当我使用时 我在java中使用了相同的代码Eclipse 那次就成功了 但现在我尝试在中使用这段代码Mono for Android C 它不起作用 我正在尝试运行此代码来创建一个InputStr
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • 生产代码中的 LRU 实现

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选
  • 通过 NHibernate 进行查询,无需 N+1 - 包含示例

    我有一个 N 1 问题 我不知道如何解决它 可以在这个问题的底部找到完全可重复的样本 因此 如果您愿意 请创建数据库 设置 NUnit 测试和所有附带的类 并尝试在本地消除 N 1 这是我遇到的真实问题的匿名版本 众所周知 这段代码对于帮助
  • g++ 对于看似不相关的变量“警告:迭代...调用未定义的行为”

    考虑以下代码strange cpp include
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • strcmp 给出分段错误[重复]

    这个问题在这里已经有答案了 这是我的代码给出分段错误 include
  • 我在在线程序挑战编译器中遇到演示错误

    include
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim

随机推荐

  • Windows操作系统知识合集

    Windows操作系统的权限 Guest权限 User权限 人类可用普通权限 Administrator 人类可用最高权限的用户 System 系统 机器可用最高权限 比人类权限高更多 TrustInstaller 操作系统的最高权限 比S
  • Aggressive cows-疯牛POJ(2456)-详解

    描述 农夫 John 建造了一座很长的畜栏 它包括N 2 lt N lt 100 000 个隔间 这些小隔间依次编号为x1 xN 0 lt xi lt 1 000 000 000 但是 John的C 2 lt C lt N 头牛们并不喜欢这
  • verilog-mode的简要介绍

    verilog mode是什么 官网的介绍 https www veripool org wiki verilog mode Verilog mode el is the extremely popular free Verilog mod
  • 静态代理模式

    1 所谓的静态代理模式应该就是把大家都会做的相同的事情交给代理去做 2 而一定要自己做的事就在代理中传入一个自己的对象再在代理的类中的该方法中调用自己的方法 3 将所有需要自己完成的方法放在一个接口中然后自己和代理都去继承他 代理还会添加一
  • invalid resource directory name

    遇到错误 当有res navigation的时候 反编译打包回apk的时候会报错 invalid resource directory name res navigation 或者是 invalid resource directory n
  • 【CV】第 15 章:结合计算机视觉和 NLP 技术

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • pc微信禁止启动小程序

    场景 最近 Windows 微信的更新了可以访问小程序的功能 但还不完善 如 尝试播放激励视频时 会直接跳过视频并作为已完成处理等 身为开发者的我们可能需要做一些处理 禁止pc的微信访问小程序 以达到减小损失的目的 提要 App onLau
  • Google Cast(Chromecast)浏览器 SDK 学习笔记(一)

    前几天因为京东打折 买了个索尼的 SRS X77 音箱 看说明书说支持 Google Cast 试了试感觉还挺好用 于是研究了一下 Google Cast 的 SDK Chromecast Google Cast 傻傻分不清楚 Google
  • Python迭代器及其用法

    列表 list 元组 tuple 字典 dict 集合 set 这些序列式容器有一个共同的特性 它们都支持使用 for 循环遍历存储的元素 都是可迭代的 因此它们又有一个别称 即迭代器 从字面来理解 迭代器指的就是支持迭代的容器 更确切的说
  • Umi4各种运行报错排查

    使用 Umi4 搭建项目 选择antd pro模版 pnpm 运行起来以后VScode编译器中出现报红 但是项目正常运行 现在强迫症处理各种报红 如果有用请点个赞 o 1 Cannot find module umi or its corr
  • windows平台对NUMA的支持

    微软官网链接 https docs microsoft com en us windows win32 procthread numa support 译文如下 多处理器支持的传统模型是对称多处理器 SMP 在这种模型中 每个处理器对内存和
  • go mod 引入指定的分支

    方式一 执行以下命令 go get git地址 分支名 如 go get github com golang go master 方式二 直接在go mod文件中添加 格式如下 git地址 v0 0 0 时间戳 commint id 例如
  • webpack静态资源地址注入html,HtmlWebpackPlugin

    说明 插件的基本作用就是生成 html 文件 原理很简单 将 webpack 中entry配置的相关入口 chunk 和 extract text webpack plugin抽取的 css 样式 插入到该插件提供的template或者te
  • 拼多多电商玩家快速采集平台数据

    作为电商卖家 选款是一件很重要的事情 所以我们在选款上面需要下大功夫分析数据 如何第一时间知晓同类商品及其价格 如何实时采集到新款 爆款 及其价格 下面我对比两种方法 看看哪种方式更适合我们普通电商从业人员 目标 抓取拼多多某类商品的列表页
  • 学习Python数据分析有什么用?

    在当今信息爆炸的时代 数据成为了各行各业中不可或缺的资源 而Python作为一种高级编程语言 拥有强大的数据分析能力 本文将详细介绍学习Python数据分析的重要性以及它在实际应用中的用途 帮助读者更好地了解并学习Python数据分析 一
  • 基于ARIMA-CNN-LSTM预测模型研究(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 1 1 A IMA 模型 1 2 CNN LSTM 模型 2 运行结果 3 参考文献 4 Python代码
  • 使用SDWAN构建安全的混合WAN

    使用SD WAN构建安全的混合WAN SDWAN的爆炸已成为头条新闻了一年多 企业正在以惊人的速度采取SDWAN 不但可以为分支机构提供更灵活的连接和利用程序性能 而且可以跨全部网络提供 远程 超级用户 依托SDWAN 通过将小型台式机装备
  • 博途 V15.1安装步骤

    温馨提醒 安装此软件电脑配置至少应满足以下要求 处理器 CoreTM i5 3320M 3 3 GHz 或相当 内存 至少8G 硬盘 300 GB SSD 显示器 15 6 宽屏显示 1920 x 1080 1 双击打开 Siemens v
  • 小程序代码提审用户隐私保护协议修改指引

    为规范开发者的用户个人信息处理行为 保障用户合法权益 小程序涉及处理用户个人信息的开发者 均需补充相应用户隐私保护指引 微信会根据小程序版本隐私接口调用情况展示必填项 开发者可自主勾选其他项目 一 代码提审版本用户隐私保护指引填写入口 管理
  • 用c99 写的简单线程池类

    include