当前位置: 首页 > ds >正文

【看到哪里写到哪里】如何在C中使用多进程设计(1)

C11开始,在<threads.h>中定义了关于多进程设计函数。但是在MSYS中支持能有限。很不好用。

如何纯粹是想学习C的多线程设计,可以使用一个轻量级的TinyCThread的C11 线程库实现,非常简单实用。

TinyCThread是一个轻量级的 C11 线程库实现,专为嵌入式系统和资源受限环境设计。它提供了与 C11 <threads.h> 兼容的 API,但无需完整的 C11 编译器支持。以下是其使用方法和示例:

1. 集成 tinythread.h

  1. 下载源码:从 GitHubhttps://github.com/tinycthread/tinycthread 获取 tinythread.h 和 tinythread.c
  2. 添加到项目:将这两个文件复制到你的项目目录。然后在程序中添加
    #include "tinycthread.h"
    

  3. 编译选项:无需特殊编译器支持(C99+ 即可),但需链接线程库(如 -pthread)。

2. 核心 API

tinythread.h 提供了与 C11 <threads.h> 兼容的接口:

线程管理
typedef struct thrd_t thrd_t;  // 线程类型int thrd_create(thrd_t *thr, thrd_start_t func, void *arg);  // 创建线程
int thrd_join(thrd_t thr, int *res);                            // 等待线程结束
int thrd_detach(thrd_t thr);                                     // 分离线程
thrd_t thrd_current(void);                                       // 获取当前线程
int thrd_equal(thrd_t t1, thrd_t t2);                            // 比较线程ID
void thrd_yield(void);                                           // 让出CPU
互斥锁(Mutex)
typedef struct mtx_t mtx_t;int mtx_init(mtx_t *mtx, int type);        // 初始化互斥锁
void mtx_destroy(mtx_t *mtx);              // 销毁互斥锁
int mtx_lock(mtx_t *mtx);                  // 加锁
int mtx_timedlock(mtx_t *mtx, const struct timespec *ts);  // 带超时加锁
int mtx_trylock(mtx_t *mtx);               // 尝试加锁
int mtx_unlock(mtx_t *mtx);                // 解锁
条件变量
typedef struct cnd_t cnd_t;int cnd_init(cnd_t *cnd);                  // 初始化条件变量
void cnd_destroy(cnd_t *cnd);              // 销毁条件变量
int cnd_wait(cnd_t *cnd, mtx_t *mtx);      // 等待条件变量
int cnd_timedwait(cnd_t *cnd, mtx_t *mtx, const struct timespec *ts);  // 带超时等待
int cnd_signal(cnd_t *cnd);                // 唤醒一个等待线程
int cnd_broadcast(cnd_t *cnd);             // 唤醒所有等待线程

3. 编译与链接

Windows(MinGW/MSYS)
gcc -std=c99 -pthread your_file.c tinythread.c -o output

或者在VSCode,添加-pthread,编译即可。

4.特性与限制

  • 优势

    • 纯 C 实现,无依赖,适合嵌入式系统。
    • 兼容 C11 <threads.h>,学习成本低。
    • 支持跨平台(POSIX、Windows、WebAssembly 等)。
  • 限制

    • 不支持 C11 原子操作(需单独使用 stdatomic.h)。
    • 部分高级功能缺失(如线程局部存储)。
http://www.xdnf.cn/news/14590.html

相关文章:

  • STM32 开发 - STM32CubeMX 下载芯片支持包、创建 HAL 库工程
  • 牙科医疗设备EMC电磁兼容技术讨论
  • 数列的极限
  • 推荐标注数据标注
  • 【精选】计算机毕业设计基于SpringBoot高校社团管理系统 社团信息维护 活动发布报名 成员审核与公告发布平台源码+论文+PPT+讲解
  • Git(三) Git 分支工作流管理模型探究与实践
  • 电容篇---常见作用
  • Apache Iceberg与Hive集成:分区表篇
  • StarRocks Community Monthly Newsletter (May)
  • JavaScript中Date对象用法详解
  • 深入实践Caffeine+Redis两级缓存架构:从原理到高可用设计
  • 「Linux文件及目录管理」文件及目录操作类命令
  • Grdle版本与Android Gradle Plugin版本, Android Studio对应关系
  • OpenWrt:交叉编译openssl
  • redis缓存的基础知识
  • DBSCAN(Density-Based Spatial Clustering of Applications with Noise)基于密度的聚类方法介绍
  • 移动应用开发实验室web组大一下期末考核题解
  • 【arXiv2024】时间序列|TimesFM-ICF:即插即用!时间序列预测新王者!吊打微调!
  • 如何用ai设计测试
  • WebStorm编辑器侧边栏
  • NodeJS的fs模块的readFile和createReadStream区别以及常见方法
  • Nacos 实战指南:服务注册、分级与环境隔离
  • 第二十六周:序列化和反序列化
  • 变幻莫测:CoreData 中 Transformable 类型面面俱到(三)
  • 【Git】代码托管服务
  • 【一天一个知识点】RAG 是“问答脑”,智能体是“有行动力的大脑”
  • AndroidStudio下载的SDK没有tool目录,或者想要使用uiautomatorviewer工具
  • 二.TvSettings从Android.bp解析成build.gradle
  • 计量经济学知识点总结与练习题(2025年)
  • gradle的 build时kaptDebugKotlin 处理数据库模块