企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
[TOC] 在头文件 threads.h 中,定义和声明了支持多线程的宏、类型和函数。所有直接与线程相关的标识符,均以前缀 thrd\_ 作为开头。例如,thrd\_t 是一个对象类型,它标识了一个线程。 函数 thrd\_create()用于创建并开始执行一个新线程。函数 thrd\_create()的其中一个参数为在新线程中需要被执行的函数 thrd\_create()的其中一个参数为在新线程中需要被执行的函数。thrd\_create()的完整原型是: ~~~ int thrd_create(thrd_t *thr, thrd_start_t func, void *arg); ~~~ 参数 func 是一个指针,它指向在新线程需要被执行的函数,而 void 指针 arg 用于向该函数传递参数。换句话说,新线程将执行函数调用 func(arg)。 参数 func 的类型为 thrd\_start\_t,它被定义为 int(\*)(void\*)(这是一个函数指针,指向一个 void 指针作为其参数并返回一个 int 值的函数),因此,该线程执行的函数返回一个 int 类型的值。 程序在后续过程中可以通过调用函数 thread\_join()获得这个 int 类型的返回值(必要时,需等待该线程执行完)。 如果一个线程启动成功,函数 thread\_create()将新线程写入一个对象进行标识,并通过参数 thr 指向该对象,然后返回宏值 thread\_success。 在大多数情况下,后续的其他操作均依赖于该线程的执行结果,并且只有当该线程完成后,才能执行其他操作。函数 thread\_join()用于确保一个线程已完成。它的原型是: ~~~ int thrd_join(thrd_t thr, int *result); ~~~ 调用 thread\_join()的线程会被阻塞,直到通过 thr 标识的线程执行完成,这里“阻塞”(block)指的是:线程会在调用 thread\_join()的位置停留必要的时间。然后,thread\_join()将线程 thr 中执行函数的返回值写入指针 result 所引用的 int 变量中,假设 result 不是一个空指针。最后,thread\_join()释放属于线程 thr 的所有资源。 如果程序逻辑上并不需要等待线程 thr 结束,则应该调用以下函数: int thrd\_detach(thrd\_t thr); thrd\_detach()使得当线程 thr 执行完成后,自动释放线程占用的所有资源。一旦一个线程执行了分离操作(调用 thrd\_detach()),将不用程序等待其结束,程序也不会获得该线程执行函数的返回值。对于每个创建的线程,调用 thread\_join()或 thread\_detach()不得超过一次。 在例 1 中的程序展示了使用并行操作处理数组的一种方式。各个线程先自行处理数组的各部分,然后将它们的处理结果组合在一起。该程序仅需计算一个数字序列的总和。 函数 sum()首先根据创建线程的最大数量确定划分数组所得的各组元素的最大数量,然后调用递归辅助函数 parallel\_sum()。 函数 parallel\_sum()将数组平均分为两半,将其中的一半交给一个新线程处理,同时调用自身来处理另一半数组。如该例所示,一个线程函数需要多个参数,这些参数通常采用结构进行封装