C11

  • C11新增多线程支持库-threads.h参考手册

    ·

    线程管理 int thrd_create(thrd_t *thr, thrd_start_t func, void *arg); thrd_create创建一个新线程,该线程的工作就是执行func(arg)调用,程序员需要为线程编写一个函数,函数签名为:thrd_start_t ,即int (*)(void*)类型的函数。新创建的线程的标识符存放在thr内。 thrd_t thrd_current(void); thrd_current函数返回调用线程的标识符。 int thrd_detach(thrd_t thr); thrd_detach会通知操作系统,当该线程结束时由操作系统负责回收该线程所占用的资源。 int thrd_equal(thrd_t thr0, thrd_t thr1); thrd_equal用于判断两个线程标识符是否相等(即标识同一线程),thrd_t是标准约定的类型,可能是一个基础类型,也可能会是结构体,开发人员应该使用thrd_equal来判断两者是否相等,不能直接使用==。即便==在某个平台下表现出来是正确的,但它不是标准的做法,也不可跨平台。 void thrd_exit(int res) thrd_exit函数提早结束当前线程,res为它的退出状态码。这与进程中的exit函数类似。 int thrd_join(thrd_t thr, int *res) thrd_join将阻塞当前线程,直到线程thr结束时才返回。如果res非空,那么res将保存thr线程的结束状态码。如果某一线程内没有调用thrd_detach函数将自己设置为detach状态,那么当它结束时必须由另外一个线程调用thrd_join函数将它留下的僵死状态变为结束,并回收它所占用的系统资源。 void thrd_sleep(const xtime *xt) thrd_sleep函数让当前线程中途休眠,直到由xt指定的时间过去后才醒过来。 void thrd_yield(void) thrd_yield函数让出CPU给其它线程或进程。 互斥对象和函数 threads.h中提供了丰富的互斥对象,用户只需在mtx_init初始化时,指定该互斥对象的类型即可。 int mtx_int(mtx_t *mtx, int type); mtx_init函数用于初始化互斥对象,type决定互斥对象的类型,一共有下面6种类型: mtx_plain –简单的,非递归互斥对象 mtx_timed –非递归的,支持超时的互斥对象 mtx_try…

    Read More

  • 使用C11新增的多线程支持库-threads.h进行多线程编程

    ·

    2019年12月6日更新 首先要感谢评论区的热心的同学们的提醒,经本人亲自验证: VS 2019中移除了对threads.h的支持(评论区有同学提到单独安装v140工具集可以实现支持,但是测试发现没有效果),而GCC方面则在最新版中加入了对该头文件的支持。 以下为原文(程序代码部分更新了Linux版Dome)。 导语 threads.h是C11标准新增的多线程支持库,在此之前C语言实现多线程,除了使用系统API外用的最多的就是pthread.h了,threads.h在语法上和pthread.h非常相似。 当然,对于新出的C语言标准,各大编译器厂商并不会马上就支持。就比如说,Linux下主流的C语言编译器————GCC,直到GCC7.2版本都没能支持该库(PS:看到老外网站上说要安装最新版glibc才能获得对该库的支持,然而亲测无卵用)。相反,VS在这方面做的就很不错,VS2017已经可以完美支持该库了,本文也将基于VS2017社区版对该库的使用方法做介绍。 注:本文仅对多线程编程的概念及threads.h库文件的使用方法做简单介绍,并不会详尽介绍该库下的所有函数,如果你需要一个函数功能的参考手册可以参考此篇文章:C11新增多线程支持库-threads.h参考手册 以一个小程序为例子 本程序中使用到的库函数及宏: thrd_t //此宏定义用于存放线程标识符的数据类型 thrd_create //此函数用于创建线程 thrd_detach //此函数用于通知操作系统,当线程结束时由操作系统负责释放资源 thrd_exit //此函数用于结束当前线程 程序功能: 主线程每2秒打印一次“I love ibadboy.net~~~”,共打印10次。子线程每1秒打印一次“He love ibadboy.net!!!”,共打印10次。我们知道,在只有一个主线程的C程序中该功能是无法实现的,因为后一段程序代码必须等待前一段代码执行完毕才可执行。但,在多线程编程中,各个线程可以一起执行(这里涉及到的同步、异步等等的高阶技术就不讨论了)。举个例子:在游戏开发中,如果程序需要实时监控用户键盘的输入,就不能把这段代码放到主线程中,因为这样的话该段代码就会被程序的其他部分阻塞掉而无法做到真正的“实时”,这时就可以利用多线程技术来化解尴尬啦!话不多说,直接上代码! 程序代码Linux版本 #include <stdio.h> #include <unistd.h> //包含sleep等函数 #include <stdbool.h> #include <threads.h> //包含多线程支持库头文件 #include <stdlib.h> //包含exit等函数 int thr_fun(void *); int main(void) { thrd_t thr; int ret; //保存thrd_create函数的返回值用于判断线程是否创建成功:0为成功,1为失败。 ret = thrd_create(&thr, thr_fun, NULL);…

    Read More